【问题标题】:PHP PCRE error preg_replacePHP PCRE 错误 preg_replace
【发布时间】:2010-11-25 23:58:29
【问题描述】:
<?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 strong> 在第 13 行。*

如何制作正确的函数pregForPreg?

【问题讨论】:

    标签: php preg-match pcre


    【解决方案1】:

    您似乎想转义特殊的正则表达式字符。该函数已存在,名为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);
    

    旁注:如果你真的想匹配字符串中的\[,正则表达式应该是\\\\\[。你看,它会变得很丑。

    【讨论】:

    • 但我的字符串没有被 preg_quote 替换
    • 否,因此您必须手动转义任何进入 preg_quote 的 \,方法是在此时字符串中已经存在的任何 \ 之前添加另一个 \。
    • @Isis:我不确定你的意思。您应该使用preg_quote 而不是pregForPreg。而且您没有指定您真正想要实现的目标......
    猜你喜欢
    • 2010-12-10
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 2010-12-25
    相关资源
    最近更新 更多