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

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

Решение
Метасимволы 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];
}

Функция quotemeta() позволяет экранировать метасимволы POSIX:

$pattern = quotemeta('M*A*S*H').':[0-9]+';
if (ereg($pattern,$tv_show_rank,$matches)) {
print 'Radar, Hot Lips, and the gang ranked: '.$matches[1];
}

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

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

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

. \ + * ? ^ $ [ ] ( )

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

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Выбор между поглощающим и непоглощающим сравнением
Нахождение n-го совпадения
Переход от ereg к preg
Поиск в файле всех строк, соответствующих шаблону
Поиск слов

Вернуться в раздел: PHP / 13. Регулярные выражения