Экранирующая строка для использования в регулярном выражении

Возможный дубликат:
Есть ли функция PHP, которая может избежать шаблонов регулярных выражений до их применения?

Я хочу использовать строку, хранящуюся в переменной в регулярном выражении. Какой лучший способ (в PHP) избежать строки для использования в регулярном выражении (PCRE)?

Например,

$text = 'm/z';  // this is the text I want to use as part of my regular expression
$text_regexp = '#' . $text . '#i';  // this is my regular expression

Давал бы

$text_regexp = '#m/z#i';

Но мне нужно следующее регулярное выражение:

$text_regexp = '#m\/z#i';

Это надуманный пример, но я хотел просто проиллюстрировать точку.

Ответ 1

preg_quote

Из руководства:

ставит обратную косую черту перед каждым характер, который является частью регулярного синтаксис выражения

Вы также можете передать разделитель как второй параметр, и он также будет экранирован. Однако, если вы используете # в качестве разделителя, тогда нет необходимости скрывать /

Ответ 3

Все эти ответы верны, только меташары должны быть экранированы. Слишком плохо, что php не имеет оператора регулярных выражений, такого как preg_match ([operator]/$var/), поэтому разделители могут быть агентом цитирования. Таким образом, делиметр не должен быть указан во внешнем $var. (Perl имеет это с операторами m//, s///или = ~)

Preg_quote - хороший способ сделать это, к сожалению, иногда вам нужно сопоставить литерал '\ char', если он не экранирован, например, \char ', и избегать остальных. Не много вариантов с preg_quote().

Вы могли бы буквально настроить свои собственные php-функции, которые ссылаются на метамарки (или снимают цитату после preg_quote()).

как заменить все /([{}\[\]()^\$.|*+?\\<>$delim])/ на \\$1 или что-то в этом роде. Установите $delim и/или уберите, возможно, escape или любые другие метамарки, которые вы не хотите экранировать.

Просто мои $.02

Ответ 4

Отметьте этот. Вы можете использовать preg_quote();.