Версия для печати

Урок 14. Регулярные заявки.

Этот урок немного не вписывается в логическую цепь наших занятий, а был создан "под давлением общественности", то есть по просьбам читателей, и будет посвящен регулярным выражениям и функциям работы с ними. Наверное, мои расчеты, что статьи Александра Грималовского "Регулярные выражения" будет достаточно для понимания этой темы, оказались неверны.

Итак, надеясь, что вы уже прочитали вышеуказанную статью, начинаем сегодняшний урок.

Сами регулярные выражения не являются новинкой, превнесенной PHP. В том или ином виде они используются уже достаточно большой срок и являются очень мощным механизмом работы со строковыми данными.

Регулярное выражение представляет из себя некий шаблон, который используется для различных действий в зависимости от функции, использующей это регулярное выражение. Для задания шаблона используются специальные символы.

Ниже представлена краткая таблица специальных символов и их значений.

Символы Значение Примеры
Символы, указывающие расположение искомого элемента в строке.
^ Указывает на то, что символы после знака должны находиться в начале строки. ^заголовок
$ Символы до знака должны находиться в конце строки. содержание$
Escape последовательности.
\. Шаблону соответствует знак точки в строке. Смеркалось\.
\n Символ перевода строки. Строка\nЕще строка
\r Символ возврата каретки. Текст\r
\t Символ табуляции. \tКрасная строка
\v Символ вертикальной табуляции. \vнекоторый текст
Задание группы символов.
[ ] Задают группу символов. Соответствует любому символу из перечисленных в группе. Есть возможность задания диапазона символов с помощью знака - (минус, тире). [а-яa-z_123]
^ В группе символов соответствует отрицанию последующих символов, то есть указывает символы, не соответствующие шаблону. [^\n\t]
. Соответствует любому символу, кроме перевода строки. .оза
Количественные показатели
* Символ перед знаком не присутствует либо повторяется любое число раз. текст\n*дальше текст
? Символ перед знаком встречается ноль или один раз. длинн?ое
+ Предыдующий символ повторяется один или большее число раз. 100+
{n} Символ перед знаком повторяется n-ое число раз. длин{2}оше{3}
{min,max} Задает диапазон числа повторений предыдущего символа. ^ab{3,7}
{min,} Предыдущий символ повторяется min или большее число раз. слово.{5,}
Логическое определение.
| Эффект подобен оператору || (OR) в логическом выражении. раз|два|три
( ) Логическая группировка выражений. (может)+ повторяться

Функции работы с регулярными выражениями.

Необходимо сказать, что PHP располагает как собственным механизмом работы с регулярными выражениями (POSIX), так и заимствованным у другого серверного языка программирования Perl. Внешне их легко различить по названиям функций: функции первого типа начинаются с символов "ereg", а второго - "preg".

Но названия функций не единственное их отличие. Прежде всего они содержат некоторые различия в синтаксисе регулярных выражений. Так, Perl-подобные функии требуют разделители:

$str = "регулярное выражение";     // просто строка
$preg = preg_replace("/р.+е/i", "<i>[вырезано]</i>", $str);
$ereg = eregi_replace("р.+е", "<i>[вырезано]</i>", $str);
echo $preg."<br>".$ereg;

Как видите, мы используем функции замены части строки с помощью регулярных выражений. Обратите внимание на шаблон функции preg_replace: в качестве разделителя здесь выступают слеши, причем после закрывающего разделителя следует модификатор i, указывающий, что шаблон является нечувствительным к регистру. Тот же эффект достигается при использовании POSIX функции с суффиксом i (eregi_replace).

Результат выполнения этих функций одинаков:

[вырезано]
[вырезано]

Функция preg_replace в нашем примере проявила так называемую "жадность", и охватила всю строку, которая начинается с буквы "р" и заканчивается "е". Заставить функцию не "жадничать" помогает модификатор U. В этом случае результат ее выполнения будет:

[вырезано] вы[вырезано]ние

Функция нашла минимальное расстояние между буквами "р" и "е" и заменило его указанной строкой.

Функция eregi_replace также проявила "жадность", но изменить этот порядок уже нельзя, так как в POSIX-функциях не предусмотрено использование модификаторов.

Бегло рассмотрим и другие функции работы с регулярными выражениями.

Функции Синтаксис Описание
ereg, eregi, preg_match функция(pattern, string, [regs]) Ищет в строке string соответствия с регулярным выражением pattern, и сохраняет их в массиве regs (если указано).
preg_match_all preg_match_all(pattern, subject, matches, [order]) Осуществляет глобальное сопоставление с шаблоном, результаты заносит в matches.
split, spliti, preg_split функция(pattern, string, [limit]) Разбивает строку в массив посредством регулярного выражения.
preg_grep preg_grep(pattern, input) Возвращает массив из элементов массива input, соответствующих шаблону pattern.

Примеры на регулярные выражения.

Перевод времени в стандартное время Unix.

Предположим, у нас в базе данных или в другом источнике хранится дата в следующем формате:
часы:минуты:секунды - день.месяц.год
Но по некоторым причинам (например, произведен редизайн сайта) нам понадобилось отображать дату в следующем виде:
день.месяц.год часы:минуты

Как вы понимаете, вручную заниматься этим - сумасшествие, так что напишем сценарий, который будет на первом этапе приводить дату к виду часы:минуты:секунды месяц/день/год, а затем с помощью функции strtotime() переведить эту запись в стандартное время UNIX, которое мы сможем отображать, как захочется.

Самое интересное - первый этап. Он-то нас и интересует в плане использования регулярных выражений.

$str = "12:57:43 - 10.03.02"; // $str содержит некоторую дату
$str = preg_replace("!(\d{2})\.(\d{2})\.(\d{2})!", "\\2/\\1/\\3", $str);

С помощью регулярного выражения мы изменяем формат записи дня, месяца и года, причем каждый этот элемент обособляем скобками. Во втором параметре функции мы ссылаемся на найденные соответствия в скобках. Вот как это происходит:

  • \\0 - содержит строку, соответствующую всему шаблону (в нашем примере "10.03.02").
  • \\1 - содержит символы, соответствующие только первому элементу, заключенному в скобки (то есть "10").
  • \\2 - содержит символы, соответствующие только второму элементу, заключенному в скобки (то есть "03").
  • и так далее.

На этом этапе мы получем дату "12:57:43 - 03/10/02". Теперь доводим это до конца.

$str = str_replace("-", "", $str); // вырезаем знак "-"
$time = strtotime($str);

Теперь можно использовать переменную $time, как заблагорассудится.

На этом и закончим наш урок. Встретимся на следующем!


Назад, на урок 13

Дальше, на урок 15 

Назад

Hosted by uCoz