【问题标题】:Escaping string for use in regular expression [duplicate]用于正则表达式的转义字符串[重复]
【发布时间】:2011-06-23 14:35:52
【问题描述】:

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

我想在正则表达式中使用存储在变量中的字符串。 (在 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';

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

【问题讨论】:

    标签: php regex escaping pcre


    【解决方案1】:

    preg_quote

    来自手册:

    在每个前面加一个反斜杠 作为常规的一部分的字符 表达式语法

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

    【讨论】:

    • 感谢您的快速回答。
    • 不客气。很高兴能提供帮助。
    • 对于概括,另见this complete answer
    【解决方案2】:

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

    【讨论】:

    • 感谢您的快速回答。
    【解决方案3】:

    您必须使用preg_quote function:

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

    $keyword 必须作为一个完整的单词匹配的示例:

    $pattern = '/\b' . preg_quote($keyword, '/') . '\b/';
    

    【讨论】:

    • 这是答案
    【解决方案4】:

    所有这些答案都是正确的,只有元字符需要转义。 php 没有像 preg_match([operator]/$var/) 这样的正则表达式运算符,这有点太糟糕了,所以分隔符可能是引用代理。这样,分隔符就不必在外部 $var 中引用。 (Perl 使用 m//,s/// 或 =~ 操作符)

    preg_quote 是一个很好的方法,不幸的是,有时你想匹配文字 '\char' 而不将它转义为 '\char',然后转义其余部分。 preg_quote() 的选择不多。

    您可以逐字地设置自己的 php 函数来引用元字符(或在 preg_quote() 之后取消引用)。

    就像用\\$1 或其他东西替换所有/([{}\[\]()^\$.|*+?\\<>$delim])/。设置 $delim,和/或取出可能的转义符或您不想转义的任何其他元字符。

    只是我的 $.02

    【讨论】:

      猜你喜欢
      • 2011-03-27
      • 2011-10-13
      • 1970-01-01
      • 2010-09-21
      相关资源
      最近更新 更多