Задача
Необходимо трактовать такие символы, как * или +, внутри регулярного выражения не как метасимволы, а как литералы. Это полезно, если пользователи вводят в строке поиска то, что впоследствии будет использовано в регулярном выражении.
Решение
Метасимволы 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;
}
Функция 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;
}
Обсуждение
Вот символы, которые функция preg_quote() превращает в escape-последовательности:
. \ + * ? ^ $ [ ] ( ) { } < > = ! | :
А эти символы будут экранированы функцией quotemeta():
. \ + * ? ^ $ [ ] ( )
Данные функции преобразуют метасимволы в escape-последовательности посредством добавления символа обратной косой черты.