我首先尝试阅读其他问题,但没有找到任何有用的信息。
我在自己的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行为的事情。
答案 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
始终有帮助。