于是乎,如果要彻底解决问题,就要在保证功能的同时确保不发生回溯。我将上面校验 URL 的正则表达式的第二部分后面加多了个 + 号,即变成这样:
^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://) (([A-Za-z0-9-~]+).)++ --->>> (这里加了个+号) ([A-Za-z0-9-~_%\/])+$
这样之后,运行原有的程序就没有问题了。
最后推荐一个网站,这个网站可以检查你写的正则表达式和对应的字符串匹配时会不会有问题。
Online regex tester and debugger: PHP, PCRE, Python, Golang and JavaScript
例如我本文中存在问题的那个 URL 使用该网站检查后会提示:catastrophic backgracking(灾难性回溯)。
藏在正则表达式里的陷阱,一个正则表达式导致CPU 利用率居高不下
当你点击左下角的「regex debugger」时,它会告诉你一共经过多少步检查完毕,并且会将所有步骤都列出来,并标明发生回溯的位置。
藏在正则表达式里的陷阱,一个正则表达式导致CPU 利用率居高不下
本文中的这个正则表达式在进行了 11 万步尝试之后,自动停止了。这说明这个正则表达式确实存在问题,需要改进。
但是当我用我们修改过的正则表达式进行测试,即下面这个正则表达式。
^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)(([A-Za-z0-9-~]+).)++([A-Za-z0-9-~\/])+$
工具提示只用了 58 步就完成了检查。
总结
以上所述是小编给大家介绍的一个正则表达式导致CPU 利用率居高不下,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
您可能感兴趣的文章: