[^ pL]奇怪的正则表达式行为

时间:2013-05-06 13:22:20

标签: php regex

我有一段PHP代替左边的所有字符而不是Unicode字母。它工作正常,有一个例外,我无法弄清楚原因。有人可以帮忙吗?

<?php
$B=$A;
do{
    $A=$B;
    $B=preg_replace('/^[^\pL\s]/','',$B);
    }
while($B!=$A);
echo $B;
?>

如果我用"\\*^&\\\@@\816.80831téstmé"这样的字符串提供它,那就很好地吐出"téstmé" $A="*^&\\\@@\816.80831[+"给出一个空字符串,也是正确的 但是,当我输入"\\*^&\\\@@\816.80831"时,我最终会得到"831",而事实上它应该是一个空字符串。

"^&\\\@@\8016.8048.31"提供"48.31"
"^&\\\@@\8016.8148.31"正确地给出一个空字符串
"^&\\\@@\8016.8148067"给出"16.8148067"
"^&\\\@@\8116.8148167"再次是空的 它似乎与零和点有关,但我找不到模式也不能找到解决方案。我尝试添加strval,但结果仍然相同。 也许有人有答案?日Thnx。

1 个答案:

答案 0 :(得分:2)

老实说,我不知道为什么会出错。它必须是某种bug。但是有一个简单的解决方案。

<?php
$B=preg_replace('/^[^\pL\s]*/','',$A);

这样它具有相同的功能,除了它有效并且开销较少。

更新:我在Java,regex coach和regexpal.com上做了一些测试,他们都正确地做了。所以这必须是preg_replace中的一个错误。