質問ですでに述べたように、Tidy は完全な HTML ドキュメントで動作するため、修復されたドキュメントには (構成されている場合) doctype が含まれますが、常に head セクションが含まれます。
完全な HTML ドキュメントではない HTML フラグメントを探しています。
この差別化には既に解決策が含まれています。HTML フラグメントを本文として挿入し、それをドキュメントとして修復してから、本文の子のみを文字列として取得します。終わり。これはかなり短いですが、すでに機能している例です:
/* Tidy example: Clean a HTML fragment */
$fragment = '<b><s>Text</b>';
$tidy = new Tidy;
$tidy->parseString($fragment);
$tidy->cleanRepair();
$result = implode('', (array) $tidy->body()->child); // <b><s>Text</s></b>
さらに一歩進んで HTML フラグメントを検証したい場合 (例: 有効な HTML タグのみ、すべてのタグが閉じている、tidy configurationも参照)、最小限の HTML を接頭辞として付けて、エラーと警告がフラグメントそのもの。ステータスは、次の方法で取得できますtidy::getStatus()
。
/* Tidy example: Validate a HTML fragment (4 samples) */
$fragments = [
['Valid fragment', '<b><s>Text</s></b>'],
['Unclosed tag', '<b><s>Text</b>'],
['Unknown tag', '<unknown></unknown>'],
['Unfinished attribute', '<a href=">link</a>'],
];
$tidy = new Tidy;
foreach ($fragments as list($title, $fragment)) {
$tidy->parseString("<!DOCTYPE html><title>HTML fragment</title><body>" . $fragment);
$status = $tidy->getStatus();
$tidy->cleanRepair();
$result = implode('', (array)$tidy->body()->child);
printf("%s - Status: %d\n HTML: %s\n Repaired: %s\n", $title, $status, $fragment, $result);
}
getType
この例では、既定の構成での戻り値の意味を示す次の出力が提供されます。
Valid fragment - Status: 0
HTML: <b><s>Text</s></b>
Repaired: <b><s>Text</s></b>
Unclosed tag - Status: 1
HTML: <b><s>Text</b>
Repaired: <b><s>Text</s></b>
Unknown tag - Status: 2
HTML: <unknown></unknown>
Repaired:
Unfinished attribute - Status: 2
HTML: <a href=">link</a>
Repaired: <a href="%3Elink%3C/a%3E"></a>
これはあなたが求めていた以上のものです。たとえば、文字列内のすべてのタグが閉じているかどうかを確認するなど、追加の例として追加しただけです。