我刚刚遇到了 HTML 解析的病态案例。我一直认为一个<script>
标签会一直运行到第一个结束</script>
标签。但事实证明并非总是如此。
这是有效的:
<script><!--
alert('<script></script>');
--></script>
甚至这是有效的:
<script><!--
alert('<script></script>');
</script>
但这不是:
<script><!--
alert('</script>');
--></script>
这也不是:
<script>
alert('<script></script>');
</script>
这种行为在 Firefox 和 Chrome 中是一致的。因此,尽管很难相信,浏览器似乎接受脚本标签内的 html 注释内的打开+关闭脚本标签。那么问题来了,浏览器是如何真正解析脚本标签的呢?这很重要,因为我正在使用的 HTML 解析库 Nokogiri 假定了明显(但不正确)的 until-the-first-close-tag 规则并且没有处理这种边缘情况。我想大多数其他图书馆也不会处理它。