Прежде всего, напомню, что регулярные выражения представляют собой обычные текстовые строки, которые используются как шаблоны для анализа текста. Эти строки составляются по специальным правилам, позволяющим описать практически любую последовательность символов.
В состав PHP входит три набора функций для работы с регулярными выражениями. К первому набору относятся функции, названия которых начинаются с ereg. Эти функции работают с регулярными выражениями стандарта POSIX. Второй набор функций, по сути, является расширением первого, и допускает использование в регулярных выражениях многобайтных символов (Unicode). Эти функции начинаются с mb_. Третий набор функций (PCRE библиотека) работает с PERL-совместимыми регулярными выражениями. Названия этих функций начинаются с приставки preg. Этот набор функций обеспечивает большую функциональность и быстродействие, поэтому рассказывать я буду именно о нем.
На правилах составления самих регулярных выражений останавливаться нет смысла. Даже их краткое описание займёт несколько десятков страниц. Поэтому перейдём к рассмотрению библиотеки. Она включает семь функций, которые позволяют выполнять поиск, замену и разбивку текста с помощью регулярных выражений.
Для поиска в тексте используются функции:
preg_grep()
preg_match_all()
preg_match()
Разница между ними заключается в количестве передаваемых параметров и возвращаемых значений. Например, preg_match() прекращает работу после первого найденного совпадения, а preg_match_all() – после того, как будут найдены все совпадения.
Замену текста можно выполнить с помощью функций:
preg_replace_callback()
preg_replace()
Как несложно догадаться, preg_replace_callback() позволяет указать специальную функцию, которая будет использована для замены найденных совпадений. preg_replace() – просто заменяет найденные совпадения на заданную строку.
Функция preg_split() разбивает текст по заданному регулярному выражению.
Остальные функции носят вспомогательный характер. preg_last_error() – возвращает код последней ошибки, возникшей при работе библиотеки. preg_quote() – экранирует символы в регулярном выражении, т.е. перед каждым служебным символом вставляет обратный слеш.
Теперь рассмотрим небольшой пример. Допустим, есть список eMail адресов, разделенных запятыми или пробелами, по которому нам требуется создать список имен пользователей.
Решить эту задачу можно следующим образом:
$text = "
[email protected],
[email protected],
[email protected] [email protected]";
$pattern = "/[,|\s]?(\S+)@/";
preg_match_all($pattern, $text, $res);
foreach ($res[1] as $name) {
echo "<p>".$name."</p>";
}
Имена пользователей соответствуют первой подмаске регулярного выражения, которое находится в переменной $pattern. Функция preg_match_all ищет все совпадения с регулярным выражением в списке адресов ($text) и сохраняет их в переменной $res.
Как видите, понадобилось всего шесть строк кода.
К недостаткам библиотеки можно отнести не полную поддержку кириллицы. Например, синтаксис регулярных выражений предусматривает возможность задания модификатора «i», который указывает, что во время поиска не нужно учитывать регистр символов. Но если текст содержит символы кириллицы (кодировка UTF-8), то на результат поиска этот модификатор влияния не окажет. Обойти эту проблему можно, если заранее преобразовать текст к нижнему регистру (например, с помощью функции mb_convert_case).
В заключение хочу сказать, что большинство проблем возникает из-за ошибок в синтаксисе самих регулярных выражений. Тут может помочь только тщательное тестирование. Не важно, каким способом, вручную, с помощью модульных тестов ( simpletest) или on-line служб проверки регулярных выражений , главное, чтобы результат был правильным.