PHP在preg_replace上崩溃

时间:2013-03-25 05:24:54

标签: php crash preg-match

我使用php.exe运行以下脚本:

preg_replace('#(?:^[^\pL]*)|(?:[^\pL]*$)#u','',$string);

或等同物:

preg_replace('#(?:^[^\pL]*|[^\pL]*$)#u','',$string);

如果$string="S"$string=" ذذ "有效,如果string='ذ'产生的不正确,并且string='ذذ' PHP崩溃了。

但它适用于4.4.0 - 4.4.9,5.0.5 - 5.1.6版本。

有什么问题?

http://3v4l.org/T3rpV


<?php
$string='دد';
echo preg_replace('#(?:^[^\pL]*)|(?:[^\pL]*$)#u','',$string);
  

输出为5.4.0 - 5.5.0alpha6

Process exited with code 139.
     

5.2.0的输出 - 5.3.22,5.5.0beta1

     

     

4.4.0 - 4.4.9,5.0.5 - 5.1.6

的输出
دد 
     

4.3.11,5.0.0 - 5.0.4的输出

Warning: preg_replace(): Compilation failed: PCRE does not support \L, \l, \N, \P, \p, \U, \u, or \X at offset 7 in /in/T3rpV on line 3 
     

4.3.0 - 4.3.10的输出

Warning: Compilation failed: PCRE does not support \L, \l, \N, \P, \p, \U, \u, or \X at offset 7 in /in/T3rpV on line 3

5 个答案:

答案 0 :(得分:5)

您可以使用替代的mb_ereg_replace()函数:

mb_internal_encoding("UTF-8");
mb_regex_encoding("UTF-8");
echo mb_ereg_replace('#(?:^[^\pL]*)|(?:[^\pL]*$)#u','',$string);

答案 1 :(得分:3)

也许这会有所帮助:

这些属性通常仅在PCRE使用“--enable-unicode-properties”进行编译时才可用

http://docs.php.net/manual/en/regexp.reference.unicode.php#96479

答案 2 :(得分:1)

从表达本身来看,有两件事可以改进:

  1. *乘数不是很有用;为什么要用空字符串替换可能为空的匹配?事实上,在我的系统上运行此功能会从NULL操作产生preg_replace()

  2. 内存组可以合并在一起。

  3. 这是应用这两项改进之后的代码:

    $string = 'ﺫﺫ';
    var_dump(preg_replace('#(?:^[^\pL]+|[^\pL]+$)#u', '', $string));
    // string(4) "ﺫﺫ"
    

    3v4l results

    如果您只是在寻找多字节修剪功能(从4.3.0开始支持):

    $string=' دد';
    var_dump(preg_replace('#(?:^\s+|\s+$)#u', '', $string));
    

    3v4l results

答案 3 :(得分:0)

使用preg_quote,您必须在使用正则表达式之前正确转义特殊字符。例如:

<?php
$string = preg_quote("\دد");
echo preg_replace('#(?:^[^\pL]*)|(?:[^\pL]*$)#u','',$string);

查看实际操作:http://3v4l.org/LeBXg

有关preg_quote的更多信息。

干杯,

阿迪

答案 4 :(得分:0)

最后,这个错误已经解决了:

Output for 4.4.0 - 4.4.9, 5.0.5 - 5.1.6, 5.5.27 - 5.5.33, 5.6.11 - 7.0.4, hhvm-3.6.1 - 3.12.0
    دد