Разработчику. Сборник рецептов PHP
Задавайте вопросы

Экранирование специальных символов
внутри регулярного выражения

Вернуться назад

Задача

Необходимо трактовать такие символы, как * или +, внутри регулярного выражения не как метасимволы, а как литералы. Это полезно, если пользователи вводят в строке поиска то, что впоследствии будет использовано в регулярном выражении.

Решение

Метасимволы Perl-совместимого регулярного выражения экранируются при помощи функции preg_quote():

$pattern = preg_quote('The Education of H*Y*M*A*N K*A*P*L*A*N').':(\d+)';
if (preg_match("/$pattern/",$book_rank,$matches)) {
       print "Leo Rosten's book ranked: ".$matches[1];
}

Обсуждение

Вот символы, которые функция preg_quote() превращает в escape-последовательности:

. \ + * ? ^ $ [ ] ( ) { } < > = ! | :

А эти символы будут экранированы функцией quotemeta():

. \ + * ? ^ $ [ ] ( )

Данные функции преобразуют метасимволы в escape-последовательности посредством добавления символа обратной косой черты.

Функция quotemeta() не находит в точности все метасимволы POSIX. Символы {, } и | также являются допустимыми метасимволами, но они не конвертируются этой функцией. Это еще одна хорошая причина применять функцию preg_match() вместо функции ereg().

Можно также передать функции preg_quote() в качестве второго аргумента дополнительный символ, чтобы преобразовать в escape-последовательность и его. Довольно полезно передать в качестве такого аргумента разделитель шаблона (обычно /), чтобы также превратить его в escape-последовательность. Это особенно важно, если в состав шаблона регулярного выражения требуется включить пользовательский ввод. Следующий фрагмент программы принимает из веб-формы строку $_REQUEST['search_term'] и ищет в строке $s слова, начинающиеся с $_REQUEST['search_term']:

$search_term = preg_quote($_REQUEST['search_term'],'/');
if (preg_match("/\b$search_term/i",$s)) {
     print 'match!';
}

Применение функции preg_quote() гарантирует правильность интерпретации регулярного выражения, если, например, поклонник Магнума П. И. (Magnum, P.I.) введет t.c. в качестве условия поиска. Без функции preg_quote() это будет соответствовать tic, tucker и другим словам, в которых первая буква t, а третья буква c. Передача разделителя шаблона функции preg_quote() также гарантирует, что пользовательский ввод с обратной косой чертой в нем, например CP/M, также будет обработан корректно.

Вернуться назад

Рейтинг@Mail.ru

Яндекс.Метрика

Индекс цитирования

Рейтинг Сайтов ДОСКИ.РУ