尽管preg_quote,工作正则表达式模式在PHP中不起作用

时间:2012-03-05 17:22:47

标签: php regex

下面的模式似乎适用于正则表达式编辑器,但它在PHP中不起作用(没有错误)。 我想通过添加分隔符并通过preg_quote运行模式会解决这个问题。 非常感谢我在这里缺少的任何帮助。

代码示例:

$pattern = '%(?<=@address|.)singleline(?=[^\]\[]*\])%';  
$pattern = preg_quote($pattern);
$output  = preg_replace($pattern, "", $output);

HTML示例:

  <p>[@address|singleline]</p>

2 个答案:

答案 0 :(得分:2)

preg_quote转义为正则表达式语法字符的字符。其中包括. \ + * ? [ ^ ] $ ( ) { } = ! < > | : -。请勿尝试使用preg_quote

$pattern = '%(?<=@address|.)singleline(?=[^\]\[]*\])%';  
$output  = preg_replace($pattern, "", $output);

修改 如果您希望在正则表达式模式中包含包含正则表达式语法中使用的字符的内容,则可能需要使用preg_quote。例如:

$input = "item 1 -- total cost: $5.00";
$pattern = "/total cost: " . preg_quote("$5.00") . "/";
// $pattern should now be "/total cost: \$5.00/"
$output = preg_replace($pattern, 'five dollars', $input);

在这种情况下,您需要转义$,因为它在正则表达式语法中使用。要搜索它,您的正则表达式应使用\$而不是$。使用preg_quote会为您执行此更改。

答案 1 :(得分:1)

我认为你应该将preg_quote应用于完整模式,bbut仅适用于(可能)外部字符串。看看这段代码:

<?php
    $content = 'singleline';
    $content = preg_quote($content);
    $output = '<p>[@address|singleline]</p>';
    $output  = preg_replace('%(?<=@address|.)'.$content.'(?=[^\]\[]*\])%', "", $output);

    echo $output;

正如您所看到的,我仅对$ content变量应用preg_quote(可能包含一些您需要转义的字符)