Регулярные выражения в PHP (сравнение Perl и PHP)

Автор: content Понедельник, Апрель 9th, 2012 Нет комментариев

Рубрика: Язык 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 и др. (в ПХП нет такой же аналогичной!).

Особенность Перловых регов в том, что после того, как вы составили выражение, его надо поместить между парных символов… Символ (обычно «/«): любой символ, кроме букв, цифр и пропусков (пробел, перевод каретки и т.д.). Желательно (надо так выбрать), чтобы этот символ не встречался в самом регулярном выражении, иначе его придется слешить. Поэтому не удивляйтесь, что почти всех примеры в ПЕРЛ-регах будут начинаться и заканчиваться парными обратными чертами (/).

Автор: Дмитрий Бородин

Источник: http://www.php.su/articles/?cat=regexp&page=005

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты