Экранирующая строка для использования в регулярном выражении
Возможный дубликат:
Есть ли функция 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
Из руководства:
ставит обратную косую черту перед каждым характер, который является частью регулярного синтаксис выражения
Вы также можете передать разделитель как второй параметр, и он также будет экранирован. Однако, если вы используете #
в качестве разделителя, тогда нет необходимости скрывать /
Ответ 2
preg_quote (строка $str [, строка $delimiter = NULL])
http://php.net/manual/en/function.preg-quote.php
Ответ 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();.