dtr32787 2010-11-25 23:58
浏览 89
已采纳

PHP PCRE错误preg_replace

<?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;

And I get an error: *Warning: preg_replace(): Compilation failed: PCRE does not support \L, \l, \N, \U, or \u at offset 50 in test.php on line 13.*

How to make a correct function pregForPreg?

  • 写回答

1条回答 默认 最新

  • doulu7921 2010-11-26 00:03
    关注

    It seems you want to escape special regex characters. This function already exists and is called preg_quote().


    You get the error, because you don't escape \ properly:

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

    and \L has special meaning in Perl regular expression:

    \L Lowercase until \E

    but is not supported in PHP's PCRE (Perl Differences):

    The following Perl escape sequences are not supported: \l, \u, \L, \U. In fact these are implemented by Perl's general string-handling and are not part of its pattern matching engine.

    Update:

    Obviously, you cannot use the escaped version as value and as pattern, because in the pattern \[ will be treated as [ and but in the value \[ is taken literally. You have to store the escaped string in a new variable:

    $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
    

    or easier:

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

    Side note: If you really wanted to match \[ in a string, the regular expression would be \\\\\[. You see, it can get quite ugly.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 merge函数占用内存过大
  • ¥15 Revit2020下载问题
  • ¥15 使用EMD去噪处理RML2016数据集时候的原理
  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大
  • ¥15 单片机无法进入HAL_TIM_PWM_PulseFinishedCallback回调函数
  • ¥15 Oracle中如何从clob类型截取特定字符串后面的字符
  • ¥15 想通过pywinauto自动电机应用程序按钮,但是找不到应用程序按钮信息
  • ¥15 如何在炒股软件中,爬到我想看的日k线
  • ¥15 seatunnel 怎么配置Elasticsearch
  • ¥15 PSCAD安装问题 ERROR: Visual Studio 2013, 2015, 2017 or 2019 is not found in the system.