2

是否可以通过以下方式配置 HTML Tidy:

给定html:

lorem ipsum</em> dolar sit amet.</p>

让它生成

<p><em>lorem ipsum</em> dolar sit amet.</p>

而不是仅仅去掉结束标签?

非常感谢

马特

4

2 回答 2

2

不,HTML Tidy 不提供该选项。

您会期望简单整洁的解析器能够推断出先前的意图。

确定一个标签何时必须关闭,是否打算在该点关闭,可以由解析器使用 html 的规则来完成。

于 2010-05-01T16:33:36.010 回答
2

我基本上同意 Sky Sanders 的回答。除了:

您会期望简单整洁的解析器能够推断出先前的意图。

您可以编写一个解析器来提供所描述的功能,而无需推断任何意图,只是确定性地工作。一个人可以很容易(是的,或多或少容易:))编写一个完成这项工作的算法。这个想法是:

添加结束标签

毕竟,这已经可以用 HTML Tidy 完成了,而且每个浏览器/解析器都已经隐式地做到了(我在这里不是在谈论有效的 XHTML):

<div>some <span><em>text</span> here</div>

得到

<div>some <span><em>text</em></span> here</div>

添加开始标签

我们现在可以做一些算法来分析以下内容,从字符串的末尾开始并反向搜索:

<div>some <span>text</em></span> here</div>

产生以下一个,因为它看到em标签嵌入在span标签中。

<div>some <span><em>text</em></span> here</div>

结合这两个

现在我们必须编写一个算法来添加缺失的结束标签和开始标签。现在让我们来看看这个 html 片段:

<div>some <span>text</em> here</div>

首先应用“添加所有缺少的结束标签”方法:

<div>some <span>text</em> here</span></div>

该算法在这里假设后面的每个结束和开始标签都<span>嵌入在span. 只有当它看到某个在<span>. 在这种情况下,这是</div>,之前有一个有效的开始标签<div>。然后在反向搜索中应用相同的语义,如前所述:

<div>some <span><em>text</em> here</span></div>

等等。

这一切有意义吗?

在我看来:不。这在技术上是可行的,但不值得付出努力。您必须实现自己的解析器以及上述伪智能方法。此外,这将对html应用一种无论如何都不存在的语义:每个浏览器/解析器都只是忽略孤立的结束标签,那么为什么要关注它们呢?

如果我还不能说服你,请考虑 html 的语义:

some <b>text</b> here读起来像:“打印'一些'。开始渲染粗体。打印'文本'。停止渲染粗体。打印'这里'。”

尽管:

some text</b> here读起来像:“打印'一些文本'。停止渲染粗体。” “什么?我什至没有开始渲染任何大胆的东西!?我会忽略那个......” :)

于 2010-05-01T19:59:43.210 回答