RegEx以获取HTML中的最后一个标记

时间:2014-06-30 00:49:47

标签: javascript regex node.js

我正在尝试在我的Node.js应用程序中编写一个正则表达式,该表达式获取页面上的最后一个</body>标记。我遇到的问题是,某些HTML网页中的iframe会添加额外的</body>。我尝试了很多不同的东西,但我无法解决这个问题。

3 个答案:

答案 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)

Don't use a regex to parse html.

node.js有许多模块可以帮助你解决这个问题:

答案 2 :(得分:0)

常规expresions ware从不打算解析文档,因为在解析多行时不惜一切代价使用它们,它们非常慢。

然而如果你真的坚持比赛而不是取最后一个结果,据我所知,在RegEx中没有反向搜索。