Регулярные выражения в PHP (сравнение Perl и PHP)
Автор: Дмитрий Бородин
Что такое регулярные выражения?
Для многих программеров, не работавших прежде в вебе,
данная область программирования неизвеста.
Если объяснять кратко, реги - это шаблоны типа тех, что
используются для выделения файлов по маске.
Только реги это отдельная наука, по которой написаны толстые
книжки (все, кроме описанной ниже, на английском).
Регурярные выражения в PHP или других
веб-языках позволяют свести до 1 команды то, что
программист, не знающих их, вынужден был бы писать
весьма долго (потом еще долго тестировать, ошибки выявлять...).
Итак регулярные выражения - это средство произвести
некоторые действия над текстом.
Средства: небольшое кол-во управляющих
элементов регулярных выражений дает огромный набор средств,
что бы среди текста выделить/найти нужные части.
Действия: копирование найденных кусков текста в переменную,
удаление их из текста, замена, изменение на сходный текст.
Пример с масками файлов: нам хочеться, переименовать все файлы,
содержащие слово "php" в похожее имя, только поставив
"regexp" на месте старого "php". Для этого мы делаем маску "*php*"
(маска и последующая операция - НЕЗАВИСИМЫ!)
и сообщаем что мы хотим: заменить все, что попадает под маску (шаблон /
регулярное выражение) на новое имя "часть1,regexp,часть2" - т.е. просто заменить
одно слово на другое. Это упрощенный пример на крайне примитивных
шаблонах - маски файлов.
Более нормальный пример: найти в таблице чей-то HTML страницы
все данные и распечатать только 2 и 4 колонки из нее (без HTML и
прочего мусора).
Обычно, с регулярными выражениями
это решается в 2 этапа:
- выделение всех _нужных_ данных в массив (всего одна команда!)
- печать (понадобиться цикл, чтобы пройтись по массиву)
Очевидно, что без регурярных выражений НЕВОЗМОЖНО
так же эффективно (в одну команду) и быстро (в 10 и более раз)
решать подобные задачи с операциями над текстом.
Классический пример с курсом всех валют на rbc.ru -
программой в 3 строки можно скачать веб-страницу - 1 строка,
получить все курсы валют
(название валюты, ед. изменения валюты, текущий курс)
в массив - 1 строка, распечатать на экран - 1 строка.
Итак, регулярные выражения это просто некая технология в программировании.
Функции для работы с ними есть в любом продвинутом языке:
во всех веб-языках, в Си и т.д.
Кроме того, реги применяют в пользовательских программах:
- в редакторах -
чтобы быстро найти нужный текст, когда простой поиск дает слишком
много не нужных совпадений
- в утилитах обработки входного потока.
Все знают, что такое "help | more". Это аналогичные программы,
только печаютают на экран не весь текст, а совпающий с шаблоном.
В Юниксах есть разнообразные egrep, awk, sed... В Windows 2000:
findstr.
- сильно упрощенные шаблоны, в других областях:
те же маски файлов в dos/win/unix, "LIKE" в MySQL, "string match" в TCL...
Факт N1
Неважно, по какой программе вы будете учить реги.
Важно, что ТЕОРИЯ будет одна и таже. Таким образом,
не пугайтесь, что приведенные ниже ссылки никоем образом
не связаны с PHP. Не в PHP их придумали (это было еще в 40-вые годы).
Регулярные выражения - это технология программирования.
Это универсальное средство быстрого выполненения любых сложных операций
с текстом.
Факт N2
Из-за того, что реги используются в разных программах, которые пишут
разные люди, сами реги по синтаксису немного отличаются. К примеру, если в Досе симовол "*" означает любую последовательность
символов, то любому человеку, изучившему маски файлов, легко
понять, что делает символ "%" в команде LIKE (MySQL).
ТОЖЕ САМОЕ, только с другим синтаксисом.
Реально, в регах есть следующие различия:
- разные программы программы поддерживают разный набор управляющих
структур (типа "*", "?" и т.д.)
- разные программы могут их по немного разному воспринимать
(скажите, под маску "???.txt" попадет файл "12.txt" или нет?) -
общий смысл один, а тонкостей много
- разные программы по разному их записывают
(в одних будет "*", в других "\*")
Все, теперь отправляйтесь смело читать документацию.
Не волнуйтесь, что быстро у вас ничего не получиться.
Программированию тоже быстро не учаться.
PHP-ориентированные и Perl-ориентированные рег.выражения
(в PHP3/4)
Есть 2 типа регов в ПХП: "Перловые" и "ПХПышные" (помните о факте N1).
Они различают внутренним устройством работы.
Перловые работают раз в 10-30 быстрее ПХПышных.
Функции PHP регов: ereg, eregi, ereg_replace, eregi_replace и др.
("i" - не учитывать регистр букв).
Perl: preg_match, preg_replace, preg_match_all и др. (в ПХП нет такой же
аналогичной!).
Особенность Перловых регов в том, что после того, как вы составили
выражение, его надо поместить между парных символов...
Символ (обычно "/"): любой символ, кроме букв, цифр и пропусков
(пробел, перевод каретки и т.д.). Желательно (надо так выбрать), чтобы этот
символ не встречался в самом регулярном выражении, иначе
его придется слешить. Поэтому не удивляйтесь, что почти всех примеры
в ПЕРЛ-регах будут начинаться и заканчиваться парными обратными чертами
(/).