{lang: ‘ru’}

уроки php для начинающих, регулярные выражения php, php регулярные выражения примеры, регулярные выражения символыЭто 10 урок серии уроки PHP для начинающих. На этом уроке мы рассмотрим для чего нужны регулярные выражения в PHP и как их правильно составлять и использовать в своих скриптах.

Что такое регулярные выражения?

Регулярное выражение — это механизм, с помощью которого можно задавать шаблоны для строк и находить данные соответствующие этим шаблонам в тексте. Кроме того, используя специальные функции, которые предназначены для работы с регулярными выражениями, найденные данные можно  получать в отформатированном виде. Стоит отметить, что они в первую очередь предназначены для поиска данных, соответствующих шаблону, который описан в синтаксисе регулярных выражений.

Сразу хочу отметить, что подробное описание синтаксиса регулярных выражений в PHP Manual, очень большое, около 50кб, и мы не будем разбирать весь синтаксис, а рассмотрим только основы, с помощью которых вы поймете принципы написания регулярных выражений.

Суть механизма регулярных выражений: регулярные выражения позволяют задать шаблон для нечеткого поиска по тексту. Например, для поиска какого-то определенного слова, можно воспользоваться обычными функциями работы со строками, они прекрасно подходят для этих целей. Но если же нам необходимо найти неопределенную фразу или слово и мы знаем только, как приблизительно это будет выглядеть — то в этом случае никак не обойтись без регулярных выражений .

Метасимволы

Метасимволы — символы которые которые встречаются в строке и имеют специальное значение. Весь механизм регулярных выражений основан именно на метасимволах.  У каждого метасимвола есть своя роль в синтаксисе регулярных выражений.

Один из самых важных метасимволов — символ обратного слэша (»). В случае нахождения парсером этого символа в строке, то символ находящийся после слэша рассматривается двояко:
если символ без слеша имеет спец значение, то он потеряет спец значение и будет рассмотрен, как обычный символ. Это сделано для того, чтобы в строку можно было вставлять спец символы, как обычные. Например: ‘.’ означает «любой единичный символ», а ‘.’ означает точку. Эти же правила подходят и для самого слэша: ‘\’.

если символ без слеша не имеет спец значения, то он может его получить, соеденившись с символом ». Например символ ‘d’ воспринимается как буква, но если его соеденить с обратным слэшем (‘d’) он станет метасимволом, который означает «любая цифра».

Существует много таких символов, которые образуют метасимволы в паре с обратным слэшем. В таблице ниже приведены некоторые наиболее часто используемые:

Метасимвол Значение
Метасимволы для задания символов, не имеющих изображения
n Символ перевода строки (код 0x0A)
r Символ возврата каретки (код 0x0D)
t Символ табуляции (код 0×09)
xhh Вставка символа с шестнадцатиричным кодом 0xhh, например x41 вставит латинскую букву ‘A’
Метасимволы для задания групп символов
d Цифра (0-9)
D Не цифра (любой символ кроме символов 0-9)
s Пустой символ (обычно символ табуляции и пробел)
S Непустой символ (все символы, кроме, определяемых метасимволом s)
w «Словесный» символ (символ, используемый в словах. Все цифры, все буквы и знак подчеркивания (‘_’))
W Все символы, кроме, определяемых метасимволом w

С остальными метасимволами можно ознакомиться в мануале.

Привожу парочку примеров:

Regexp Комментарии
/ddd/ Любое трехзначное число (’321′, ’222′, ’099′)
/wsdd/ Буква, пробел (или табуляция) и двузначное число (‘w 59′, ‘K 51′, ‘z 43′)
/d and d/ Любая из следующих строк: ’3 and 1′, ’1 and 9′, ’2 and 4′.

Подмножества

Синтаксис регулярных выражений позволяет определять подмножества символов. Для описания таких подмножеств используют квадратные скобки ‘[]‘. Квадратные скобки, которые встречаются внутри регулярного выражения являются одним символом. Внутри этих скобок можно перечислять значения.

Следует отметить, что внутри квадратных скобок работают не все метасимволы, а только перечисленные ниже:

  • Обратный слэш (»). Метасимволы из таблицы приведенной выше будут работать.
  • Минус (‘-’). Задает набор символов из одного промежутка (все цифры можно задать как ’0-9′)
  • Символ ‘^’. Рассматривается как символ отрицания в случае, если стоит первым в квадратных скобках.
Regexp Комментарии
[0-9A-Fa-f] Цифра в шестнадцатиричной системе счисления
[dA-Fa-f] То же самое, но с использованием метасимвола
[02468] Четная цифра
[^d] Все, кроме цифр (аналог метасимвола D)
[a^b] Любой из символов ‘a’, ‘b’, ‘^’. Заметьте, что здесь символ ‘^’ не имеет какого-либо специального значения, потому что стоит не на первой позиции внутри квадратных скобок.

Дополнительные символы

  • Использование символов ’^’ и ‘$’ необходимо для того чтобы парсер обратил внимание на расположение искомого текста в строке.
    ‘^’ — искомый текст находится в начале строки
    ‘$’ — искомый текст находится в конце строки
    Привожу пример. Предположим у нас есть текст:
    21 xxx yyy
    xxx 72 zzz
    xxx xxx 54Чтобы найти числа в этом тексте, используем регулярное выражение: /dd/m (на модификатор, пока не обращаем внимания). Используя это регулярное выражение мы найдем 3 значения: ’21′, ’72′, ’54′. Мы ограничим поиск, указав, где именно должен располагаться текст: /^dd/m. Теперь мы получим только один результат — ’21′, потому что это число располагается в начале строки, а другие нет. Аналогично регулярное выражение /dd$/m возвратит результат ’54′.
  • Символ точки ‘.’ — указывает, что на данном месте может находиться любой другой символ (кроме символа перевода строки). Если необходимо пропустить букву в слове при проверке, то этот символ прекрасно подходит для этого.
    Например регулярное выражение /.yz/ найдет в тексте и ‘xyz’ и ‘Xyz’ и ‘Ayz’ и ’6yz’.
  • Символ вертикальной черты ‘|’ — задает список альтернатив.
    Например: выражение /(красный | зеленый) помидор/ найдет в тексте все словосочетания ‘красный помидор’ и ‘зеленый помидор’. Что означают круглые скобки смотрите далее.
  • Символы круглых скобок ‘(‘ и ‘)’. С помощью круглых скобок можно получить дополнительную информацию из искомой строки. Если парсер находит в строке круглые скобки, то он рассматривает их содержимое, как еще одно регулярное выражение. Если поиск по выражению в круглых скобках не удался, то все регулярное выражение считается неудачным и ничего не найдет.
    Например нам нужно узнать семизначный номер телефона с указанием кода города, то следует воспользоваться следующим выражением:  /((d{3,5}))s+(d{3}-d{2}-d{2})/
    Первая круглая скобка здесь теряет свое специальное значение и будет рассматриваться как обычный символ:
    /((d{3,5}))s+(d{3}-d{2}-d{2})/Далее идет регулярное выражение в скобках (проверка кода города):
    /((d{3,5}))s+(d{3}-d{2}-d{2})/После этого идет закрывающая круглая скобка, которая также лишена своего специального значения из-за символа обратного слэша, стоящего перед ней:
    /((d{3,5}))s+(d{3}-d{2}-d{2})/Затем идет пропуск пустого места:
    /((d{3,5}))s+(d{3}-d{2}-d{2})/

    И еще одно регулярное выражение в скобках, которое проверяет номер телефона:
    /((d{3,5}))s+(d{3}-d{2}-d{2})/

    Допустим у нас есть строка: «phone number is (050) 765-43-21″. Результатами поиска будут 3 строки: ‘ (050) 765-43-21′, ’050′ и ’765-43-21′.

Количественные  показатели

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

  • Звездочка ‘*’ — символ должен быть повторен 0 или более раз (может отсутствовать или быть в любом количестве).
    Пример: выражение /go*gle/ найдет строки ‘ggle’, ‘gogle’, ‘google’ и т.д.
  • Плюс ‘+’ — символ должен быть повторен 1 или более раз (обязательно присутствует и быть в любом количестве).
    Пример: выражение /go*gle/ найдет строки ‘gogle’, ‘google’ и т.д., но не найдет ‘ggle’
  • Знак вопроса ‘?‘ — символ, как может присутствовать, так и нет, не может повторяться более одного раза.
    Пример: выражение /go*gle/ найдет строки ‘ggle’, ‘gogle’
  • Фигурные скобки ‘{‘ и ‘}‘. Используя фигурные скобки можно определить количество символов для повторения. В скобках указывается минимальное и максимальное количество повторений для символа. Важно заметить, что любой из параметров можно пропустить. Указав  внутри скобок только одно число можно задать точное количество повторений. Примеры:
    {2,4} — повторяется минимум 2 раза, но не более 4.
    {,5} — может отсутствовать (не задано минимальное количество повторений), но если присутствует, то должен повторяться не более 5 раз.
    {3,} — повторяется минимум 3 раза, но может больше.
    {4} — повторяется ровно 4 раза

Модификаторы

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

Модификатор Значение
i Включение режима case-insensitive, т.е. буквы в верхнем регистре и в нижнем не различаются в выражении.
m Текст, по которому осуществляется поиск, будет рассмотрен, как несколько строк. По умолчанию текст рассматривается, как одна строка. Метасимволы ‘ ^ ‘ и ‘ $ ‘ указывают на начало и конец всего текста. Если указать этот модификатор, то эти метасимволы будут указывать на начало и конец каждой строки текста.
s Модификатор снимает ограничение на перенос строки с метасимвола ‘ . ‘
U Все количественные метасимволы становятся «не жадными» по умолчанию

Функции

Функции, поддерживающие регулярные выражения:

split()
ereg()
ereg_replace()
eregi()
eregi_replace()

Функция split() -  разбивает строку на подстроки

array split(string pattern, string string, int [limit]);

Функция возвращает массив строк, образованный разбитием данной строки на части, каждая строка в массиве является подстрокой  этой строки. Подстроки отделяются друг от друга разделителем, который указывается в параметре pattern. С помощью третьего параметра можно указать количество элементов массива. В случае ошибки функция возвращает false.

Функция ereg() — поиск в строке по шаблону с учетом регистра

int ereg(string pattern, string string, array [regs]);

Функция осуществляет поиск шаблона указанном в pattern в строке string. Если шаблон найден, то функция возвратит значение, отличное от нуля. В третьем параметре можно записать части строки, которые соответствуют шаблону. При поиске регистр учитывается.

Функция ereg_replace() — поиск с заменой текста по шаблону с учетом регистра

string ereg_replace(string pattern, string replacement, string string);

Используя шаблон pattern находит текст в строке string и заменяет его на replacement. В случае удачи возвращает измененную строку, в противном случае — исходную строку. Функция чувствительна к регистру.

Функция eregi() — поиск в строке по шаблону без учета регистра

int eregi(string pattern, string string, array [regs]);

Эта функция идентична ereg(), единственное отличие в том, что она не чувствительна к регистру.

Функция eregi_replace() - поиск с заменой текста по шаблону без учета регистра

string eregi_replace(string pattern, string replacement, string string);

Функция идентична ereg_replace(), единственное отличие в том, что она не чувствительна к регистру.


Получайте новые статьи блога прямо себе на почту