Символы |
Значение |
Примеры |
Символы, указывающие расположение искомого элемента
в строке. |
^ |
Указывает на то, что символы после знака должны находиться в начале
строки. |
^заголовок
|
$ |
Символы до знака должны находиться в конце строки. |
содержание$ |
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 ( ereg i _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); |
С помощью регулярного выражения мы изменяем формат записи дня, месяца и года,
причем каждый этот элемент обособляем скобками. Во втором параметре функции
мы ссылаемся на найденные соответствия в скобках.
|