Основы PHP
  Что такое PHP?
  Возможности PHP
  Преимущества PHP
  История развития
  Что нового в PHP5?
  «Движок» PHP
  Переход на PHP 5.3
New Переход на PHP 5.6
  Введение в PHP
  Изучение PHP
  Основы CGI
  Синтаксис PHP
  Типы данных PHP
  Переменные в PHP
  Константы PHP
  Выражения PHP
  Операторы PHP
  Конструкции PHP
  Ссылки в PHP
  PHP и ООП
  Безопасность
  Функции PHP
  Функции по категориям
  Функции по алфавиту
  Стандартные функции
  Пользовательские
  PHP и HTTP
  Работа с формами
  PHP и Upload
  PHP и Cookies
  PHP и базы данных
  PHP и MySQL
  Документация MySQL
  Учебники
  Учебники по PHP
  Учебники по MySQL
  Другие учебники
  Уроки PHP
  Введение
  Самые основы
  Управление
  Функции
  Документация
  Математика
  Файлы
  Основы SQL
  Дата и время
  CURL
  Изображения
  Стили
  Безопасность
  Установка
  Проектирование БД
  Регулярные выражения
  Подготовка к работе
  Быстрый старт
  Установка PHP
  Установка MySQL
  Конфигурация PHP
  Download / Скачать
  Скачать Apache
  Скачать PHP
  Скачать PECL
  Скачать PEAR
  Скачать MySQL
  Редакторы PHP
  Полезные утилиты
  Документация
  PHP скрипты
  Скачать скрипты
  Инструменты
  PHP в примерах
  Новости портала
 Главная   »  Сборник статей
 
 

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

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

 
 » Обсудить эту статью на форуме

 
 Сборник статей 
 Содержание раздела 
Есть еще вопросы или что-то непонятно - добро пожаловать на наш  форум портала PHP.SU 
 

 
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS