Это 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(), единственное отличие в том, что она не чувствительна к регистру.
Получайте новые статьи блога прямо себе на почту