preg_match_all在不同的服务器上表现得很奇怪

时间:2014-08-19 08:36:38

标签: php regex linux preg-match match

我首先尝试阅读其他问题,但没有找到任何有用的信息。

我在自己的PC上有一个PHP 5.3.28和PHP 5.4.7的开发服务器。

$string = '<if test="sub_function(parameter_1, parameter_2)">Match this</if>';
preg_match_all("/<if test=['\"]([!\w|&(),-\s]+)['\"]>(.*?)<\/if>/s", $string, $matches, PREG_SET_ORDER);

上面的代码在我的xampp环境中工作正常,但在x86_64-redhat-linux-gnu服务器上不起作用。在linux环境中,$ matches是假的,在我的xampp上看起来像这样:

Array
(
    [0] => Array
        (
            [0] => Match this
            [1] => sub_function(parameter_1, parameter_2)
            [2] => Match this
        )
)

可能导致此行为的原因是什么?这也适用于我的其他PC,如PHP 5.2 - 5.3。

编辑: regexp故意复杂,它比我向你展示的用途更多。我想知道的是影响服务器上preg_match行为的事情。

1 个答案:

答案 0 :(得分:3)

我认为问题出在这里

[!\w|&(),-\s]

这不是有效范围。一些PCRE版本更宽松并且允许这样的东西,但是(至少在OSX上),php 5.5和5.6拒绝运行这个说法

Warning: preg_match_all(): Compilation failed: invalid range in character class at offset 25...

您可以通过转义-或将其移至最后来轻松解决此问题:

[!\w|&(),\-\s]

此外,将error_reporting设置为E_ALL始终有帮助。