我目前在使用XHTML读取时遇到问题,因为XML解析器无法识别HTML字符实体,因此:
<?php
$text = <<<EOF
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Entities are Causing Me Problems</title>
</head>
<body>
<p>Copyright © 2010 Some Bloke</p>
</body>
</html>
EOF;
$imp = new DOMImplementation ();
$html5 = $imp->createDocumentType ('html', '', '');
$doc = $imp->createDocument ('http://www.w3.org/1999/xhtml', 'html', $html5);
$doc->loadXML ($text);
header ('Content-Type: application/xhtml+xml; charset: utf-8');
echo $doc->saveXML ();
结果:
Warning: DOMDocument::loadXML() [domdocument.loadxml]: Entity 'copy' not defined in Entity, line: 8 in testing.php on line 19
如何在允许自己将页面作为XHTML5提供的同时解决这个问题?
答案 0 :(得分:12)
XHTML5没有DTD,因此您可能不会在其中使用旧式HTML命名实体,因为没有文档类型定义来告诉解析器该语言的命名实体是什么。 (除了预定义的XML实体<
,&
,"
和>
...以及'
,但您通常不希望使用该实体)。
而是使用数字字符引用(©
),或者更好的是,使用简单的未编码©
字符(UTF-8;记住包含<meta>
元素来表示字符设置为非XML解析器。)
答案 1 :(得分:2)
请尝试使用DOMDocument::loadHTML()
。它不会阻塞不完美的标记。
答案 2 :(得分:0)
你不应该使用loadXML和saveXML并在html文档的顶部添加标记
<?xml.
而是使用loadHTML和saveHTML并添加
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
答案 3 :(得分:0)
Hy尝试使用cdata
$text = <<<EOF
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Entities are Causing Me Problems</title>
</head>
<body>
<![CDATA[<p>Copyright © 2010 Some Bloke</p>]]>
</body>
</html>
EOF;