Пишем реги
28.06.2009Введение
Иногда при программировании очередного проекта (а в РНР даже довольно часто) возникает необходимость обработки текстовых строк - поиск, замена, переработка, граббинг и так далее. Для борьбы с изобретателями велосипедов придумали очень мощное средство - регулярные выражения. Эту статью я хочу посвятить обучению регулярным выражениям в примерах. Статья подразумевает, что читатель знаком с PHP хотя бы поверхностно.
Во-первых нужно знать, что это такое. Регулярные выражения - это система для разбора текстовой информации по заданному шаблону. Регулярными выражениями можно проводить как поиск так и замену текста. На самом деле, после прочтения этой статьи Вы поймёте, что при помощи регулярных выражений можно (но не нужно) сделать всё что угодно, именно поэтому так важно уметь их использовать. Я поставил перед собой цель научить читателя пользоваться регулярными выражениями с умом, то есть применять их только там, где это действительно необходимо и приносит желаемый результат.
Во вторых нужно знать, что в РНР имеются регулярные выражения сразу двух типов. Первые - это регулярные выражения из Perl, которые оформляются точно также, как и в языке программирования Perl, реализующие их функции в PHP начинаются с префикса preg_. Вторые - регулярные выражения в стиле POSIX (о том, что такое POSIX знать необязательно, но желающие могут поискать в Интернете), эти функции начинаются с префикса ereg. Несмотря на то, что обоими способами можно решать одни и те же задачи, принципиальные отличия в их работе всё-таки есть. Самое главное - это то, что ereg значительно медленнее preg. В одной из своих статей я уже писал, почему предпочтительнее использовать регулярные выражения из Perl, поэтому именно об этих выражениях пойдёт сегодня речь. Отличия между синтаксисом ereg и preg мизерные, поэтому, освоив один из них, Вы быстро освоите и второй.
Первое знакомство с функциями preg_match и preg_match_all
Функция preg_match (как следует из её названия) проверяет, совпадает ли заданная строка с шаблоном. Она возвращает true, если совпадения найдены и false, если совпадений нет После первого же совпадения с шаблоном функция прекращает свою работу. preg_match_all отличается от её тем, что не прекращает работу после нахождения первого совпадения, а обрабатывает строку до конца и возвращает либо 0, либо количество совпадений. Это очень удобно, если нужно подсчитать, например, количество адресов e-mail.
Простейшее использование функции:
preg_match ( $pattern, $string ); или preg_match_all ( $pattern, $string );
Здесь $string - обрабатываемая строка, а $pattern - сам шаблон. Как раз понимание работы шаблонов вызывает трудности, поэтому мы остановимся на них более, чем подробно.
Шаблоны
Шаблон - главная составляющая регулярных выражений, при помощи этих шаблонов можно найти в тексте практически всё что угодно. Большей частью шаблоны состоят из абсолютно бессмысленной для нормального человека абракадабры, и именно этой абракадабре будет посвящена оставшаяся часть статьи.
Страндартная структура Perl-совместимого регулярного выражения:
/тело_шаблона/опции
В качестве опции выступает набор символов и каждый символ что-то означает. Наиболее распространены две опции: s и i. i означает, что шаблон регистронезависмый, иными словами поиск будет вестись без учета регистра. s означает, что шаблон будет "заглатывать" символы переноса строки и возврата каретки (в противном случае поиск совпадений ведётся построчно). Я предпочитаю всегда использовать связку si, так как она расширяет круг поиска. Записывается всё это следующим образом:
/тело_шаблона/s или: /тело_шаблона/i или: /тело_шаблона/si или даже так: /тело_шаблона/is
Тело шаблона состоит из комбинаии управляющих последовательностей. Их довольно много, и все подряд перечислять я не буду, но того, что я дам, хватит для написания 99% программ за глаза.
Поиск подстроки. Самое простое (и самое бестолковое) применение регулярных выражений - это поиск подстроки в тексте. Для этого в качестве шаблона просто задается последовательность символов, которую нужно найти. Пример:
echo preg_match ( "/foo/i", "foobar" ); echo preg_match ( "/foo/i", "Foobar" ); echo preg_match ( "/foo/", "Foobar" );Первый вариант выведет 1, так как подстрока "foo" была найдена в строке "foobar". Второй вариант выведет 1, а третий - 0 (подумайте сами, почему).
Но, как я уже упомянул выше, это бестолковое использование функции регулярных выражений. Палить из тактического ядерного оружия по воробьям в программировании - особенно плохая примета, поэтому для поиска подстроки в строке рекомендуется пользоваться функцией strpos, которая на прядок проще и быстрее, тем более она предназначена как раз для таких задач. Продолжение следует...
© RPG
Назад