RegExp или Регулярные выражения в мире PHP. Часть 1

Примечание: Мы постараемся сложную тему по регулярным выражениям, сделать понятнее для большинства. Много было прочитано статей и решено задач, прежде чем начать писать эту статью.

Что такое Регулярные выражения, можно изучить на Википедии https://ru.wikipedia.org/wiki/Регулярные_выражения

Шаблоны

[abc]

Соответствует символу a, b или c

Пример: Дана строка a bb vvvv www ccc , дан шаблон /[abc]+/ , необходимо найти все символы указанные в шаблоне

$string = 'a bb vvvv www ccc';
preg_match_all("/[abc]+/", $string, $matches);
var_dump($matches);
    array (size=3)
      0 => string 'a' (length=1)
      1 => string 'bb' (length=2)
      2 => string 'ccc' (length=3)

[^abc]

Соответствует любому символу, кроме a, b или c

Пример: Дана строка Anything but abc. , дан шаблон /[^abc]+/ , необходимо найти все символы, кроме указанных в шаблоне

$string = 'Anything but abc.';
preg_match_all("/[^abc]+/", $string, $matches);
var_dump($matches);
    array (size=3)
      0 => string 'Anything ' (length=9)
      1 => string 'ut ' (length=3)
      2 => string '.' (length=1)

[a-z]

Соответствует любым символам от a до z, включая a и z.

Пример: Дана строка Only a-z, дан шаблон /[a-z]+/, необходимо найти все символы, от a до z, включая a и z, регистрозависиый шаблон

$string = 'Only a-z';
preg_match_all("/[a-z]+/", $string, $matches);
var_dump($matches);
    array (size=3)
      0 => string 'nly' (length=3)
      1 => string 'a' (length=1)
      2 => string 'z' (length=1)
---------------------------------------------
### [^a-z]

Соответствует любым символам, кроме символов в диапазоне от a до z.

Пример: Дана строка Anything but a-z., дан шаблон /[^a-z]+/, необходимо найти все символы, кроме символов в диапазоне от a до z, регистрозависимый шаблон

$string = 'Anything but a-z.';
preg_match_all("/[^a-z]+/", $string, $matches);
var_dump($matches);
    array (size=5)
      0 => string 'A' (length=1)
      1 => string ' ' (length=1)
      2 => string ' ' (length=1)
      3 => string '-' (length=1)
      4 => string '.' (length=1)

[a-zA-Z]

Соответствует любым символам от a до z или от A до Z. Вы можете комбинировать столько, сколько захотите.

Пример: Дана строка abc123DEF, дан шаблон /[a-zA-Z]+/, необходимо найти все символы от a до z или от A до Z. Регистрозависимый шаблон

$string = 'abc123DEF';
preg_match_all("/[a-zA-Z]+/", $string, $matches);
var_dump($matches);
    array (size=2)
      0 => string 'abc' (length=3)
      1 => string 'DEF' (length=3)

.

Соответствует любому символу, кроме новой строки (или включая символы конца строки с флагом /s)

Пример: Дана строка a b c, дан шаблон /.+/, необходимо найти любой символ, кроме новой строки.

$string = 'a b c';
preg_match_all("/.+/", $string, $matches);
var_dump($matches);
    array (size=1)
      0 => string 'a b c' (length=5)

a|b

Соответствует либо тому, что стоит перед | или что стоит после него - в данном случае a илиb.

Вы можете использовать альтернативы локально как часть группы захвата / не захвата. Например: /I love (?:cats|dogs) but hate snakes/

Пример: Дана строка a or b, pick one!, дан шаблон /a|b/, необходимо найти символ или a или b

$string = 'a or b, pick one!';
preg_match_all("/a|b/", $string, $matches);
var_dump($matches);
    array (size=2)
      0 => string 'a' (length=1)
      1 => string 'b' (length=1)

\s

Соответствует любому символу пробела, табуляции или новой строки.

Пример: Дана строка any whitespace character, дан шаблон /\s/, необходимо найти символ пробела, табуляции или новой строки.

$string = 'any whitespace character';
preg_match_all("/\s/", $string, $matches);
var_dump($matches);
    array (size=2)
      0 => string ' ' (length=1)
      1 => string ' ' (length=1)

\S

Соответствует чему-либо, кроме пробела, табуляции или новой строки.

Пример: Дана строка any non-whitespace, дан шаблон /\S+/, необходимо найти все символы, кроме символов пробела, табуляции или новой строки.

$string = 'any non-whitespace';
preg_match_all("/\S+/", $string, $matches);
var_dump($matches);
    array (size=2)
      0 => string 'any' (length=3)
      1 => string 'non-whitespace' (length=14)

\d

Соответствует любой десятичной цифре. Эквивалентно [0-9].

Пример: Дана строка one: 1, two: 2, дан шаблон /\d/, необходимо найти все цифры в строке.

$string = 'one: 1, two: 2';
preg_match_all("/\d/", $string, $matches);
var_dump($matches);
    array (size=2)
      0 => string '1' (length=1)
      1 => string '2' (length=1)

\D

Соответствует чему-либо, кроме десятичных цифр.

Пример: Дана строка one: 1, two: 2, дан шаблон /\D+/, необходимо найти все символы, кроме цифр.

$string = 'one: 1, two: 2';
preg_match_all("/\D+/", $string, $matches);
var_dump($matches);
    array (size=2)
      0 => string 'one: ' (length=5)
      1 => string ', two: ' (length=7)

\w

Соответствует любой букве, цифре или знаку подчеркивания. Эквивалентно [a-zA-Z0-9_].

Пример: Дана строка any word character, дан шаблон /\w+/, необходимо найти любую букву, цифру или знак подчеркивания.

$string = 'any word character';
preg_match_all("/\w+/", $string, $matches);
var_dump($matches);
    array (size=3)
      0 => string 'any' (length=3)
      1 => string 'word' (length=4)
      2 => string 'character' (length=9)

\W

Соответствует чему-либо, кроме буквы, цифры или символа подчеркивания. Эквивалент [^ a-zA-Z0-9_]

Пример: Дана строка not.a@word%character, дан шаблон /\W+/, необходимо найти любой символ, кроме букв, цифр или символа подчеркивания.

$string = 'not.a@word%character';
preg_match_all("/\W+/", $string, $matches);
var_dump($matches);
    array (size=3)
      0 => string '.' (length=1)
      1 => string '@' (length=1)
      2 => string '%' (length=1)

(?:...)

Группа без захвата позволяет вам применять квантификаторы к части вашего регулярного выражения, но не захватывает / не назначает идентификатор.

Например, повторить 1–3 цифры и точку 3 раза можно так: /(?:\d{1,3}\.){3}\d{1,3}/

Пример: Дана строка match this match that, дан шаблон /match this (?:match that)/, необходимо найти match this и одно повторение match that

$string = 'match this match that';
preg_match_all("/match this (?:match that)/", $string, $matches);
var_dump($matches);
    array (size=1)
      0 => string 'match this match that' (length=21)

(...)

Изолирует часть полного совпадения, на которую позже будет ссылаться идентификатор в регулярном выражении или в массиве совпадений. Идентификаторы начинаются с 1.

Распространенное заблуждение состоит в том, что повторение группы захвата будет создавать отдельные идентификаторы для каждого совпадения. Если эта функциональность необходима, вместо этого следует полагаться на глобальный флаг (/g). Например: /each (word)/g

Пример:

$string = 'match and capture capture ?';
preg_match_all("/match and (capture )+/", $string, $matches);
var_dump($matches);
array (size=2)
  0 => 
    array (size=1)
      0 => string 'match and capture capture ' (length=26)
  1 => 
    array (size=1)
      0 => string 'capture ' (length=8)

a?

Соответствует символу a или ничего.

Пример: Дана строка ba b a, дан шаблон /ba?/, необходимо найти или ba или b

$string = 'ba b a';
preg_match_all("/ba?/", $string, $matches);
var_dump($matches);
    array (size=2)
      0 => string 'ba' (length=2)
      1 => string 'b' (length=1)

a*

Соответствует нулю или нескольким последовательным символам a.

Пример: Дана строка a ba baa aaa ba b, дан шаблон /ba*/, необходимо найти или ba или baa или b

$string = 'a ba baa aaa ba b';
preg_match_all("/ba*/", $string, $matches);
var_dump($matches);
    array (size=4)
      0 => string 'ba' (length=2)
      1 => string 'baa' (length=3)
      2 => string 'ba' (length=2)
      3 => string 'b' (length=1)

a+

Соответствует одному или нескольким последовательным символам a.

Пример: Дана строка a aa aaa aaaa bab baab, дан шаблон /a+/, необходимо найти все последовательности символа a

$string = 'a aa aaa aaaa bab baab';
preg_match_all("/a+/", $string, $matches);
var_dump($matches);
    array (size=6)
      0 => string 'a' (length=1)
      1 => string 'aa' (length=2)
      2 => string 'aaa' (length=3)
      3 => string 'aaaa' (length=4)
      4 => string 'a' (length=1)
      5 => string 'aa' (length=2)

a{3}

Соответствует ровно 3 последовательным символам a.

Пример: Дана строка a aa aaa aaaa, дан шаблон /a{3}/, необходимо найти все символы a, которые повторяются три раза

$string = 'a aa aaa aaaa';
preg_match_all("/a{3}/", $string, $matches);
var_dump($matches);
    array (size=2)
      0 => string 'aaa' (length=3)
      1 => string 'aaa' (length=3)

a{3,}

Соответствует как минимум 3 последовательным символам a.

Пример: Дана строка a aa aaa aaaa aaaaaa, дан шаблон /a{3,}/, необходимо найти все символы a, которые повторяются минимум три раза

$string = 'a aa aaa aaaa aaaaaa';
preg_match_all("/a{3,}/", $string, $matches);
var_dump($matches);
    array (size=3)
      0 => string 'aaa' (length=3)
      1 => string 'aaaa' (length=4)
      2 => string 'aaaaaa' (length=6)

a{3,6}

Соответствует от 3 до 6 (включительно) последовательных символов «a».

Пример: Дана строка a aa aaa aaaa aaaaaaaaaa, дан шаблон /a{3,6}/, необходимо найти все символы a, которые повторяются минимум три раза и максимум шесть раз.

$string = 'a aa aaa aaaa aaaaaaaaaa';
preg_match_all("/a{3,6}/", $string, $matches);
var_dump($matches);
    array (size=4)
      0 => string 'aaa' (length=3)
      1 => string 'aaaa' (length=4)
      2 => string 'aaaaaa' (length=6)
      3 => string 'aaaa' (length=4)

^

Соответствует началу строки без использования символов. Если используется многострочный режим /m, он также будет соответствовать сразу после символа новой строки.

Пример: Дана строка start of string, дан шаблон /^\w+/, необходимо найти первое слово в строке.

$string = 'start of string';
preg_match_all("/^\w+/", $string, $matches);
var_dump($matches);
    array (size=1)
      0 => string 'start' (length=5)

$

Соответствует концу строки без использования каких-либо символов. Если используется многострочный режим, он также будет соответствовать непосредственно перед символом новой строки.

Пример: Дана строка end of string, дан шаблон /\w+$/, необходимо найти последнее слово в строке.

$string = 'end of string';
preg_match_all("/\w+$/", $string, $matches);
var_dump($matches);
    array (size=1)
      0 => string 'string' (length=6)

\b

Соответствует, без использования каких-либо символов, непосредственно между символом, совпадающим с \w, и символом, не совпадающим с \w (в любом порядке). Его нельзя использовать для отделения не слов от слов.

Пример:

$string = 'word boundaries are odd';
preg_match_all("/d\b/", $string, $matches);
var_dump($matches);
    array (size=2)
      0 => string 'd' (length=1)
      1 => string 'd' (length=1)

\B

Соответствует без использования каких-либо символов позиции между двумя символами, совпадающими с \w.

Пример:

$string = 'regex is really cool';
preg_match_all("/r\B/", $string, $matches);
var_dump($matches);
    array (size=2)
      0 => string 'r' (length=1)
      1 => string 'r' (length=1)

Оцените статью: