转义字符串以用于正则表达式

时间:2011-02-08 17:38:19

标签: php regex escaping pcre

  

可能重复:
  Is there a PHP function that can escape regex patterns before they are applied?

我想在正则表达式中使用存储在变量中的字符串。跳转字符串以便在(PCRE)正则表达式中使用的最佳方式(在PHP中)是什么?

例如,

$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';

这是一个人为的例子,但我想简单说明这一点。

4 个答案:

答案 0 :(得分:42)

preg_quote

从手册:

  

在每个人面前加上反斜杠   属于常规的角色   表达式语法

您也可以将分隔符作为第二个参数传递,它也将被转义。但是,如果您使用#作为分隔符,则无需转义/

答案 1 :(得分:8)

preg_quote(string $ str [,string $ delimiter = NULL])

http://php.net/manual/en/function.preg-quote.php

答案 2 :(得分:5)

检查this。您可以使用preg_quote();.

答案 3 :(得分:5)

所有这些答案都是正确的,只有metachars需要被转义。 有点太糟糕了,php没有像preg_match([operator] / $ var /)那样有一个正则表达式运算符,所以delimeters可能是引用代理。这种方式不需要在外部$ var中引用分隔符。 (Perl有m //,s ///或=〜运算符)

preg_quote是一种很好的方法,不幸的是,有时你想要匹配文字'\ char',而不是将其转义为'\ char',例如,然后逃避其余的。 preg_quote()的选择并不多。

你可以真正设置自己的php函数,引用metachars(或在preg_quote()之后取消引用。)

就像用/([{}\[\]()^\$.|*+?\\<>$delim])/或其他内容替换所有\\$1一样。设置$ delim,和/或取出你不想转义的转义或任何其他元素。

只是我的$ .02