PHP PCRE错误preg_replace

时间:2010-11-25 23:58:29

标签: php preg-match pcre

<?php
    function pregForPreg($value)
    {
        $value = preg_replace(array('#\(#', '#\)#', '#\+#', '#\?#', '#\*#', '#\##', '#\[#', '#\]#', '#\&#', '#\/#', '#\$#', '#\\\\#'), array('\(', '\)', '\+', '\?', '\*', '\#', '\[', '\]', '\&', '\/', '\\\$', '\\\\'), $value);
        return $value;
    }

    $var = "TI - Yeah U Know [OFFCIAL VIDEO] [TAKERS] [w\LYRICS]";

    $var = pregForPreg($var);
    //$var is now:
    //    TI - Yeah U Know \[OFFCIAL VIDEO\] \[TAKERS\] \[w\LYRICS\]
    $var = preg_replace("#" . $var . "#isU", 'test', $var);
    echo $var;

我收到错误:*警告:preg_replace():编译失败:PCRE不支持 test.php中偏移50处的\ L,\ l,\ N,\ U或\ u 在第13行。*

如何制作正确的函数pregForPreg?

1 个答案:

答案 0 :(得分:5)

似乎你想要逃避特殊的正则表达式字符。此功能已存在,名为preg_quote()


您收到错误,因为您没有正确转义\

TI - Yeah U Know \[OFFCIAL VIDEO\] \[TAKERS\] \[w\LYRICS\]
//                   this is not escaped   ------^

\L在Perl正则表达式中具有特殊含义:

  

\L Lowercase until \E

但PHP的PCRE(Perl Differences)不支持:

  

不支持以下Perl转义序列:\l, \u, \L, \U。事实上,这些是由Perl的一般字符串处理实现的,并不是其模式匹配引擎的一部分。

<强>更新

显然,您不能将转义版本用作值和模式,因为在模式中\[将被视为[,但值\[中的字面值将被视为$var = "TI - Yeah U Know [OFFCIAL VIDEO] [TAKERS] [w\LYRICS]"; $escaped = preg_quote($var); echo $escaped . PHP_EOL; // prints "TI - Yeah U Know \[OFFCIAL VIDEO\] \[TAKERS\] \[w\\LYRICS\]" $var = preg_replace('#' . $escaped . '#isU', 'test', $var); echo $var; // prints test 。您必须将转义字符串存储在新变量中:

$var = preg_replace('#' . preg_quote($var) . '#isU', 'test', $var);

或更容易:

\[

旁注:如果您真的想在字符串中匹配\\\\\[,则正则表达式将为{{1}}。你看,它会变得非常难看。