最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Node.js的DOM解析器tagRegExp正则表达式匹配挂起:灾难性回溯?

运维笔记admin11浏览0评论

Node.js的DOM解析器tagRegExp正则表达式匹配挂起:灾难性回溯?

Node.js的DOM解析器tagRegExp正则表达式匹配挂起:灾难性回溯?

我使用Node.js的DOM解析器,(unideally)拉出来的标签使用正则表达式的DOM。

你可以找到DOM解析器在:

有时,一些网页的HTML(如/)导致的Node.js应用程序挂起。我用一个普通的匹配脚本测试,发现tagRegExp使脚本挂(也许是因为灾难性回溯的?)

实际上,我用它来寻找链接的rel =“规范”和A HREF =“XYZ”(如果有的话,ecosia没有规范)。

tagRegExp:

/(<\/?[a-z][a-z0-9]*(?::[a-z][a-z0-9]*)?\s*(?:\s+[a-z0-9-_]+=(?:(?:'[\s\S]*?')|(?:"[\s\S]*?")))*\s*\/?>)|([^<]|<(?![a-z\/]))*/gi

纯JS测试脚本:

<script type="text/javascript">
var text = '... html source ...';
var text_esc = text
text_esc = text_esc.replace(/\</g, "&lt;");
text_esc = text_esc.replace(/\>/g, "&gt;");
var regex = /(<\/?[a-z][a-z0-9]*(?::[a-z][a-z0-9]*)?\s*(?:\s+[a-z0-9-_]+=(?:(?:'[\s\S]*?')|(?:"[\s\S]*?")))*\s*\/?>)|([^<]|<(?![a-z\/]))*/gi;
var found = text.match(regex);
var found_len = found.length;

document.write("Text: " + text_esc + "<br /><br />" + "Regex pattern: " + regex + "<br /><br />");

document.write("Matches: " + found_len + "<br /><br />");

for (var i=0;i<found_len;i++)
{
    found[i] = found[i].replace(/\</g, "&lt;");
    found[i] = found[i].replace(/\>/g, "&gt;");

    document.write("[" + i + "]: " + found[i] + "<br /><br />");
}
</script>

任何想法深受欢迎。提前致谢。

回答如下:

该问题是由[\s\S]*?图案和低效(x|[^x])*状图案而引起的。

您可以使用

/(<\/?[a-z][a-z0-9]*(?::[a-z][a-z0-9]*)?\s*(?:\s+[a-z0-9-_]+=(?:'[^']*'|"[^"]*"))*\s*\/?>)|[^<]*(?:<(?![a-z\/])[^<]*)*/gi

所述'[\s\S]*?'变成'[^']*'其中[^']*是贪婪地定量否定的字符类匹配比'"[\s\S]*?"被处理以相同的方式以外的任何字符。一个否定字符类比.*?懒对手更好,因为它不是在一个去和正则表达式引擎指定的一个(或多个)其他不具备这种模式后,尝试了所有后续的子模式,然后在故障每次展开所有字符匹配。

([^<]|<(?![a-z\/]))*可以unrolled[^<]*(?:<(?![a-z\/])[^<]*)*,它将匹配相同的文本,但更快的(以前一样,贪婪量词否定字符类模式经过文本更快)。

请注意我也删除了几个多余的非捕获组。

发布评论

评论列表(0)

  1. 暂无评论