我正在尝试在我的Node.js应用程序中编写一个正则表达式,该表达式获取页面上的最后一个</body>
标记。我遇到的问题是,某些HTML网页中的iframe会添加额外的</body>
。我尝试了很多不同的东西,但我无法解决这个问题。
答案 0 :(得分:4)
您应该使用HTML解析器,例如https://github.com/cheeriojs/cheerio
通常,HTML语法不是常规,因此无法使用常规表达式正确匹配。
但是,由于文档中只能有一个<body>
,因此实际上可以在不调用Zalgo的情况下使用正则表达式查找其结束标记,因为您不需要创建完全解析树,你只需要标记化流。但是在HTML5中仍然存在一些疯狂的令牌化状态和重新分析规则(例如从未闭合的<script>
恢复),我不太确定它们是否可以用正则表达式表达。
但如果您只是使用HTML解析器,它将为您节省处理有趣案例的麻烦,例如:
<!-- </body -->
<iframe srcdoc="yup, that's valid</body>"></iframe>
<script>alert("</body> yet?");/*
</body> not this one
*/</script>
</BoDy
>
<-- ^^ it was the one above, or was it? </body>
哦,有效的HTML文档根本不需要明确的</body>
!它由</html>
或文档末尾自动隐含。
答案 1 :(得分:2)
答案 2 :(得分:0)
常规expresions ware从不打算解析文档,因为在解析多行时不惜一切代价使用它们,它们非常慢。
然而如果你真的坚持比赛而不是取最后一个结果,据我所知,在RegEx中没有反向搜索。