PHP在preg_替换上崩溃怎么办?

  • 回答 (5)
  • 关注 (0)
  • 查看 (90)

我使用以下脚本运行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);

Output for 5.4.0 - 5.5.0alpha6

Process exited with code 139.

Output for 5.2.0 - 5.3.22, 5.5.0beta1

Output for 4.4.0 - 4.4.9, 5.0.5 - 5.1.6

دد

Output for 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

Output for 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

死者是小智死者是小智提问于
刺猬Christian.CS.真理使人得自由.回答于

最后,该漏洞得到了解决:

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

uncle_light培知回答于

在你的正则表达式中使用preg_quote之前,你必须正确地转义这个特殊的字符。例如:

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

看到它的action:http://3v4l.org/LeBXg

更多关于 preg_quote.

御姐万岁回答于

改进之后的代码:

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

多字节的TRIM函数(从4.3.0开始支持):

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

3v4l结果

咕噜sasa心之所向,金石为开回答于
mb_internal_encoding("UTF-8");
mb_regex_encoding("UTF-8");
echo mb_ereg_replace('#(?:^[^\pL]*)|(?:[^\pL]*$)#u','',$string);

扫码关注云+社区

领取腾讯云代金券