7

如果不知道文档的其余部分是什么样子,我显然无法确定 HTML 的片段是否有效(至少,我需要一个 doctype 才能知道我正在验证哪些规则)。但鉴于以下 HTML5 片段:

<article><header></article>My header</header><p>My text</p></article>

我当然可以在不查看文档的其余部分的情况下确定它是无效的。那么,是否存在诸如“临时有效”的 HTML 或“有效的提供它适合有效文档中的某个位置”之类的东西?

除了以下伪代码之外,还有更多内容吗?

def is_valid_fragment(fragment):
 tmp = "<!doctype html><html><head><title></title></head><body>" + fragment + "</body></html>"
 return my_HTML5_validator.is_valid_html5_document(tmp)
4

4 回答 4

5

您当然可以谈论格式良好的XML文档,并且可以从任何单个元素及其子元素构造文档。因此,您可以谈论具有良好格式的单根 XHTML5 片段。您可以通过将其作为文档序列处理,或将其包装在一些合成容器元素中来处理多根片段(如) - 因为我们只讨论格式良好,所以没关系。<img/><img/>

但是,HTML5 仍然允许 SGML 自关闭标签,like<hr>等,其自关闭性只能通过诉诸 doctype 来确定。例如,<div><hr></div>可以,但<div><tr></div>不是。如果您处理的是 DOM 节点而不是文本作为输入,这将不成问题,但如果您有文本,则需要一个对 HTML 有足够了解的解析器才能处理这些元素。但是,除此之外,一些直接从 XML 中提取的非常简单的规则就足以处理格式良好的问题。

如果您想超越格式良好并查看有效性的某些方面,我认为您仍然可以使用 XML 在单根片段级别上做到这一点。正如规范所说:

如果 XML 文档具有关联的文档类型声明并且文档符合其中表达的约束条件,则它是有效的。

DTD 可以将任何元素命名为根,然后该机制负责检查该元素与其子元素及其子元素等之间的关系,以及构成有效性的各种其他约束。

同样,您可以将该想法直接转换为 HTML。不过,我不知道您如何处理多根片段。请记住,某些整个文档的约束(例如 ID 是唯一的)可能会保留在片段中,但一旦将片段插入其中,则不会保留在其他有效的文档中。

于 2010-11-09T13:32:05.603 回答
0

一种粗略的方法是检查通过另一个元素的 innerHTML 传递片段是否会通过执行类似于以下代码的操作来更改文本。

<html>
<head>
</head>
<script>
function validateHTML(htmlFragment) {
   var testDiv = document.getElementById('testDiv')
   testDiv.innerHTML = htmlFragment
   var res = htmlFragment==testDiv.innerHTML
   testDiv.innerHTML = ""
   return res
}
</script>
<body>
<div id=testDiv style='display:none'></div>

<textarea id=txtElem onKeyUp="this.style.backgroundColor = validateHTML(this.value) ? '' : '#f00'"></textarea>

</body>
</html>
于 2020-01-15T15:34:46.273 回答
0

根据您打算对此验证执行的操作,我认为您应该记住,浏览器对格式错误的 HTML非常宽容!

您在示例中提供的无效 HTML 字符串在(大多数如果不是全部)浏览器中可以正常工作:

const serializedHTML = "<article><header></article>My header</header><p>My text</p></article>"
const range = document.createRange()
const fragment = range.createContextualFragment(serializedHTML)
console.log(fragment)

上面代码片段中定义的片段内容将生成以下 DOM 树:

<article>
  <header></header>
</article>
"My header"
<p>My text</p>
于 2020-01-15T16:38:56.417 回答
-3

您可以检查它是否格式正确。

于 2010-11-09T13:29:14.077 回答