开发者

PHP PCRE error preg_replace

开发者 https://www.devze.com 2023-01-27 04:59 出处:网络
<?php function pregForPreg($value) { $value = preg_replace(array(\'#\\(#\', \'#\\)#\', \'#\\+#\', \'#\\?#\', \'#\\*#\', \'#\\##\', \'#\\[#\', \'#\\]#\', \'#\\&#\', \'#\\/#\', \'#\\$#\', \'#\\\\
<?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);
    //$v开发者_开发知识库ar 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?


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.

0

精彩评论

暂无评论...
验证码 换一张
取 消