正如您在问题中已经指出的那样,Tidy 对完整的 HTML 文档进行操作,因此修复后的文档包含(如果已配置)一个文档类型,但始终包含一个 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>
这比您要求的要多,我只是将其添加为一个附加示例,例如查看字符串中的所有标签是否都已关闭。