Возможный дубликат:
Есть ли функция 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';
Это надуманный пример, но я хотел просто проиллюстрировать точку.
preg_quote
Из руководства:
помещает обратную косую черту перед каждым символом, который является частью синтаксиса регулярных выражений
Вы также можете передать разделитель как второй параметр, и он также будет экранирован. Однако, если вы используете #
качестве разделителя, тогда нет необходимости скрывать /
preg_quote (строка $ str [, строка $ delimiter = NULL])
Все эти ответы верны, только меташары должны быть экранированы. Слишком плохо, что php не имеет оператора регулярных выражений, такого как preg_match ([operator] / $ var /), поэтому разделители могут быть агентом цитирования. Таким образом, делиметр не должен быть указан во внешнем $ var. (Perl имеет это с операторами m //, s /// или = ~)
Preg_quote – это хороший способ сделать это, к сожалению, иногда вам нужно сопоставить литерал '\ char', если он не экранирован, например, \ \ char, и избегать остальных. Не много вариантов с preg_quote ().
Вы могли бы буквально настроить свои собственные php-функции, которые цитируют меташары (или снимают цитату после preg_quote ()).
как заменить все /([ /([{}\[\]()^\$.|*+?\\<>$delim])/
\\$1
/([{}\[\]()^\$.|*+?\\<>$delim])/
\\$1
/([{}\[\]()^\$.|*+?\\<>$delim])/
с \\$1
или что-то в этом роде. Установите $ delim и / или вытащите, возможно, escape или любые другие метамарки, которые вы не хотите экранировать.
Просто мои $ 0,02
Проверьте это . Вы можете использовать preg_quote () ;.