繁体   English   中英

PHP PCRE错误preg_replace

[英]PHP PCRE error 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;

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

如何制作正确的函数pregForPreg?

看来您想转义特殊的正则表达式字符。 该函数已经存在,称为preg_quote()


您收到错误,因为您无法正确转义\\

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

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

\\L小写,直到\\E

但PHP的PCRE( Perl差异 )不支持:

不支持以下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);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM