gpt4 book ai didi

php - preg_match 在 php > 5.3 中失败

转载 作者:可可西里 更新时间:2023-11-01 13:26:50 25 4
gpt4 key购买 nike

我不擅长正则表达式,所以我什至不知道这个到底是做什么的:

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>”(使其缩短一个或多个字符)- 它开始工作并返回 0。如果我将其更改为“123123123123123123123123123”,它也可以工作并返回 1。

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


UPD2:我确实明白它的用途……或多或少……现在让任何东西正常工作都没有问题。正如我所说 - Zend_Validate_* 更新解决了它。我将尝试用其他词来描述我的担忧:

比如说,我升级了一个重要的软件,使 php5.2 > php5.3 切换。我试图找到有关我可能面临的所有问题的信息(主要是通过阅读:http://php.net/manual/en/migration53.php)。软件有点老,但不老,e.g. Zend Framework 可能是 1.5 版。我检查/修补/分析并修复每个 bc 中断和弃用的功能。甚至我的单元测试也运行良好。

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

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

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

最佳答案

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

另外,它看起来像是在尝试匹配有效的域名,但实际上并没有。我会将对 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";

关于php - preg_match 在 php > 5.3 中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10644449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com