Tuesday, August 12, 2008

Регулярные выражения в РНР

Достаточно часто приходится работать с регулярными выражениями. В этом посте - основы, которые лучше держать в голове, но если вдруг они забудутся - то можно освежить память.
Итак.
Регулярные выражения - это усовершенствованная система шаблонов. Сначала пишется шаблон, затем с помощью одной из встроенных функций РНР он применяется к текстовой строке (регулярные выражения используются исключительно для работы со строками).
Шаблон определяется комбинацией символов, групп и классов.

Литералы
Первый тип символов, используемый для создания шаблона. Он обозначает только то, что обозначает, и не более того.
Например,шаблону «а» будет соответствовать только буква «а»,
шаблону «ab» - только «ab» и т.д.
Литералы позволяют находить точные соответствия.

Метасимволы
Более сложной структурой, чем литералы, являются метасимволы. Это специальные символы, имеющие более широкое значение. Они приведены в таблице.
(И то, чего нет в таблице, здесь "\s" - пробел)

Так, если «а» означает просто «а», то первый метасимвол, точка (.), отождествляется с любым отдельным символом (а, 1, % и т.д.).
Есть три метасимвола, позволяющие находить многочисленные соответствия:
«а*» отождествляется с нулем или любым количеством букв «а» (а, аа,ааа и т.д.);
«а+» отождествляется с одной или более «а» (а, аа, ааа и т.д., но хотя бы одна должна быть);
«а?» отождествляется с нулем или одной буквой «а».

Для поиска определенного количества одной буквы необходимо поместить в фигурные скобки диапазон ({}), указав либо конкретное число, либо минимум, либо и минимум и максимум.
Например,
«а {3}» будет соответствовать только «ааа»;
«а {3 ,}» - ааа, аааа и т.д. (три или больше букв «а»);
«а {3 , 5}» - ааа,аааа и ааааа (между тремя и пятью буквами включительно).

Знак «крышечка» ^, тот, что обычно представлен на клавиатуре над цифрой 6) будет соответствовать строке, начинающейся со следующей за знаком буквы. Этот знак можно условно представить как псевдосимвол, с которого начинается каждая строка.

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

В регулярных выражениях также используется знак вертикальной черты | как эквивалент слова «или».
Например, запись а | b будет соответствовать строкам а или b,
а запись gre | ay будет отождествляться с обоими вариантами написания названия цвета (по-английски и grey, и gray означают «серый»).

Специальные символы ". [ ] $ ( ) | * ? {} \ в шаблоне должны быть экранированы посредством поставленного перед ними обратного слеша.

Сопоставление с шаблонами
В РНР есть две встроенные функции, предназначенные специально для сопоставления с шаблоном в строке: еrеg ( ) и eregi ( ) .
Разница между ними состоит в том, что функция еrеg ( ) реагирует на регистр, a eregi () - нет, то есть не различает строчные и прописные буквы.
Значение обеих функций будет истинным, если произошло совпадение с шаблоном, и ложным в противном случае.
Ниже представлены два способа использования этих функций:

ereg("pattern", "string");
или

$Pattern = "pattern";
$String = "string";
eregi($Pattern, $String);