Сами регулярные выражения не являются новинкой, превнесенной PHP. В том или ином виде они используются уже достаточно большой срок и являются очень мощным механизмом работы со строковыми данными.
Регулярное выражение представляет из себя некий шаблон, который используется для различных действий в зависимости от функции, использующей это регулярное выражение. Для задания шаблона используются специальные символы.
Ниже представлена краткая таблица специальных символов и их значений.
|
Функции работы с регулярными выражениями.
Необходимо сказать, что 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 ( ereg i _replace ).
Результат выполнения этих функций одинаков:
[вырезано]
[вырезано]
Функция preg_replace в нашем примере проявила так называемую "жадность", и охватила всю строку, которая начинается с буквы "р" и заканчивается "е". Заставить функцию не "жадничать" помогает модификатор U . В этом случае результат ее выполнения будет:
[вырезано] вы [вырезано] ние
Функция нашла минимальное расстояние между буквами "р" и "е" и заменило его указанной строкой.
Функция eregi_replace также проявила "жадность", но изменить этот порядок уже нельзя, так как в POSIX-функциях не предусмотрено использование модификаторов.
Бегло рассмотрим и другие функции работы с регулярными выражениями.
|
Примеры на регулярные выражения.
Перевод времени в стандартное время 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, как заблагорассудится.
На этом и закончим наш урок. Встретимся на следующем!
Автор: Статья взята с MyPHP.NET.RU
|
Авторам статті важлива Ваша думка. Будемо раді його обговорити з Вами:
comments powered by Disqus