我正在尝试检查html文档,以确保body标记上方的标记正确无误。如果发现删除它的错误。
以下是我要测试的可接受标签列表。
<head>
<title>
<style>
<base>
<link>
<meta>
<script>
<noscript>
我有一个html页面,在head部分有一个锚标记,它不应该这样我希望删除整个标记。
<html>
<head>
<meta>
<title></title>
<meta>
<link>
<style></style>
<script></script>
<a></a>
<script></script>
</head>
<body>
我使用下面的代码列出了标签名称。它没有按顺序在doc上列出它们,但是按顺序它应该就像它正在纠正html结构一样。
$html = file_get_contents($url);
$doc = new DOMDocument();
@$doc->loadHTML($html);
$nodes = $doc->getElementsByTagName('*');
foreach($nodes as $item ){
echo $item->nodeName.'<br>';
}
它实际上将错开放置标记前面的开放体标记移动了。
<html>
<head>
<meta>
<title></title>
<meta>
<link>
<style></style>
<script></script>
<body>
<a></a>
<script></script>
关于如何测试开放式正文标记上方的html标记是否正确以及删除那些不是标记的html标记的任何想法或建议都将不胜感激。
答案 0 :(得分:1)
DOMDocument会在文档的头部或正文中遇到意外标记时发出警告,因此您可以在脚本中启用错误报告,并使用DOMDocument的输出作为指导您的HTML是否符合要求。使用上面的示例:
<?php
ini_set('display_errors', 1); // turn error display on
error_reporting(E_ALL | E_STRICT); // display all errors!
$html = '<html>
<head>
<meta>
<title></title>
<meta>
<link>
<style></style>
<script></script>
<a></a>
<script></script>
</head>
<body>
</body>
</html>';
$d = new DOMDocument;
$d->loadHTML($html); // don't suppress errors when loading the HTML
这给出了输出:
警告:DOMDocument :: loadHTML():意外的结束标记:头部在实体中,第24行的test.php中的第11行
警告:DOMDocument :: loadHTML():htmlParseStartTag:实体中的错误标记,第24行的test.php中的第12行
您可以保存文档,并将放错位置的元素移动到正确的位置:
echo $d->saveHTML();
输出:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><head><meta><title></title><meta><link><style></style><script></script></head><body><a></a>
<script></script><article></article></body></html>
请注意,默认情况下,doctype设置为html 4.0,并且<a>
元素现在位于正文中;任何html5标记,例如<article>
或<section>
都会被删除。
说了这么多,如果你想验证你的文档语法,你最好通过W3C Validator(可以在本地下载和安装)或nu validator运行你的html,这会增加(部分)html5验证,作为libxml,DOMDocument充当接口,不验证html5文档。
答案 1 :(得分:0)
也许你会考虑使用Tidy扩展,其唯一的目的是整理你的标记? :)