在PHP中,简单的正则表达式似乎会导致无限循环


Simple regex seems to cause infinite loop in PHP

下面是我的代码:

$rank_content = file_get_contents('https://www.championsofregnum.com/index.php?l=1&ref=gmg&sec=42&world=2');
$tmp_ = preg_replace("/.+width=.16.> /Uis", "", $rank_content, 1);

上面的第二行导致一个无限循环。相反,以下替代方法可以工作:

$tmp_ = preg_replace("/.+width=.16.> /Ui", "", $rank_content, 1);
$tmp_ = preg_replace("/[^§]+width=.16.> /Uis", "", $rank_content, 1);

但遗憾的是,它们并没有给我我想要的-两个替代方案都不包括$rank_content中的换行符。

同样,如果我用

之类的东西替换file_get_contents函数
$rank_content = "asdfas'nasdfasdfaswidth=m16m> teststring";

也没有问题,虽然'n也代表换行,不是吗?!

所以我理解它正确,RegEx有问题,注意到一个字符串的换行吗?

我如何通过删除一些行来过滤$rank_content(其中有多行)的子字符串,直到出现"width="16" "之类的东西?(可查看网站源代码)

m修饰符替换为s修饰符。m改变了^$的行为,而s改变了.的行为

也就是说,不应该用regex解析HTML。认真对待。

我放弃了:似乎问题是干草堆变量$rank_content的长度。它的长度约为90,000,而regex match()允许的最大长度约为30,000,所以我猜regex replace()也是如此。如果有人感兴趣,解决这个问题肯定是可能的:请查看这个链接-> PHP preg_match_all limit

我自己将使用另一种方法来解决这个问题,例如阅读HTML Unit网站的内容,或者可能逐行检索网站。