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の自己閉鎖タグなどを引き続き使用できます。この自己閉鎖<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 に答える