我使用Node.js的DOM解析器,(unideally)拉出来的标签使用正则表达式的DOM。
你可以找到DOM解析器在:https://github.com/ershov-konst/dom-parser
有时,一些网页的HTML(如https://www.ecosia.org/)导致的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, "<");
text_esc = text_esc.replace(/\>/g, ">");
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, "<");
found[i] = found[i].replace(/\>/g, ">");
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\/])[^<]*)*
,它将匹配相同的文本,但更快的(以前一样,贪婪量词否定字符类模式经过文本更快)。
请注意我也删除了几个多余的非捕获组。