php preg_match_all因未知原因杀死了页面

时间:2012-02-25 20:35:55

标签: php email preg-match-all

我正在尝试验证一堆文本并检查其中是否有任何电子邮件...所以我使用以下代码:

if (preg_match_all("/^([a-zA-Z0-9_.-])+@([a-zA-Z0-9_.-])+\\.([a-zA-Z])+([a-zA-Z])+/", $str, $matches)){

}

这适用于Page1

中的TEXT_A

但是当我进入Page2并尝试再次检查TEXT_A时,它会在“问题加载页面”错误的情况下终止页面...

如果我删除此检查页面将加载正常...我不明白为什么会发生这种情况......

编辑:即时通讯使用CodeIgniter

1 个答案:

答案 0 :(得分:1)

我发现您的正则表达式中存在可能导致Catastrophic Backtracking的问题。

^([a-zA-Z0-9_.-])+@([a-zA-Z0-9_.-])+\\.([a-zA-Z])+([a-zA-Z])+
                                       ^^^^^^^^^^^^^^^^^^^^^^

您想在我标记的区域内匹配什么?

正则表达式应该如何知道第二组中的哪一封信应该适用?

如果你有更长的字母序列可以匹配,正则表达式将需要很多步骤来匹配 ==>你有性能问题,正则表达不能及时完成!

我会说你可以删除最后一组,正则表达式会匹配相同但更快。

^([a-zA-Z0-9_.-])+@([a-zA-Z0-9_.-])+\\.([a-zA-Z])+