php - 在正文标记上方测试HTML标记名称

时间:2014-10-03 23:01:53

标签: php

我正在尝试检查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标记的任何想法或建议都将不胜感激。

2 个答案:

答案 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扩展,其唯一的目的是整理你的标记? :)