preg_match在php>中失败5.3

时间:2012-05-17 22:40:28

标签: php preg-match

我对正则表达不太好,所以我甚至不知道这个是什么,确切地说:

echo preg_match('/^(([a-zA-Z0-9\x2d]{1,63}\x2e)*[a-zA-Z0-9\x2d]{1,63}){1,254}$/', 'example12345678.com>');

我从Zend Framework的旧版本中获取了它 - 1.5,这已经过时了,在框架的最后一个稳定版本中,这个正则表达式不再出现了。但是,它的行为很奇怪,因为我在官方php资源中找不到任何文档说明或向后不兼容的注释。

问题在于PHP 5.2。*它工作正常:返回0.在php 5.3.10,5.4.0(很可能5.3。,5.4。我认为)它返回FALSE,意思是“错误”。

我的问题是:为什么?什么是错误?它是正则表达式,某种递归或规则歧义吗?为什么它适用于php 5.2,如果是的话?


有趣的是,如果我改变'example12345678.com>'到'example1234567.com>' (使一个或多个char更短) - 它开始工作并返回0.如果我将其更改为'123123123123123123123123123'它也可以工作并返回1.

UPD :不知道这是否重要,但这里的pcre版本是8.02(php 5.2)vs 8.12(php 5.3)


UPD2 :我确实理解它的用途......或多或少...现在让任何工作都没有问题。正如我所说 - Zend_Validate_ *更新解决了它。我会用其他话来描述我的担忧:

说,我升级了一个重要的软件,制作php5.2> php5.3开关。我试图找到我可能遇到的所有问题的信息(主要是通过阅读:http://php.net/manual/en/migration53.php)。该软件有点陈旧,但它并不古老,例如Zend Framework可能是1.5版本。我检查/修补/分析并修复每个bc中断和不推荐使用的功能。甚至我的单元测试运行良好。

令我惊讶的是,问题中描述了什么。 (确切地说,Zend_Validate_Hostname会抛出异常)。所以现在我想知道为什么我在升级时错过了这个,更重要的是,我是否应该在应用程序中重新检查所有'preg_match'(以及其他PCRE利用函数),尝试各种可想象的输入数据以尝试找到类似的“错误修复” ”

如果是“错误修复”。因为它看起来像一个新的bug - 它曾经在php5.2中按预期工作,不再起作用了。

希望得到一些线索来缩小搜索范围。

1 个答案:

答案 0 :(得分:3)

这是一个丑陋的正则表达式。问题是,字符串可能匹配的方式太多,因此引擎在内存耗尽之前尝试了所有这些,然后才发现它实际上并不匹配。

此外,它看起来正在尝试匹配有效的域名,但事实并非如此。我会通过调用此函数替换对preg_match的调用:

function is_valid_domain_name($string) {
    if (strlen($string) > 253) {
        return false;
    }
    $label = '(?!-)[a-zA-Z0-9-]{0,63}(?<!-)';
    return preg_match("/^(?:$label\.){0,126}$label$/", $string);
}

您的问题字符串很快失败:

echo is_valid_domain_name('example12345678.com>'),"\n";