我正在使用以下代码:
$doc = new DOMDocument();
$doc->loadHTML("<i><p><strong>From: fsong | #001</strong><br/>I hate you DomDocument :(.</p></i><br/>you'd be surprised<br/>");
echo $doc->saveHTML();
在CLI中运行它让我
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<i><p><strong>From: fsong | #001</strong><br>I hate you DomDocument :(.</p></i><br>you'd be surprised<br>
</body></html>
通过Web浏览器运行时返回:
Warning: DOMDocument::loadHTML(): Unexpected end tag : i in Entity, line: 1 in /home/xx/www/test/topic_archiver_test.php on line 50
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<i></i><p><strong>From: fsong | #001</strong><br>I hate you DomDocument :(.</p>
<br>you'd be surprised<br>
</body></html>
现在我意识到在(i)标签内嵌入(p)标签会破坏HTML规则,但我不是负责HTML的人。出于某种原因,CLI模式会返回与原始文档类似的文档,而网页版本会提前关闭(i)标记以保持HTML格式良好。
我的php.ini配置中是否有导致行为差异的内容?我检查了官方文档(http://www.php.net/manual/en/dom.configuration.php),似乎没有任何配置文件或DomDocument的设置。
答案 0 :(得分:1)
由于某种原因,它似乎试图验证HTML。运行php 5.3.5和libxml 2.7.6时没有任何错误。
忽略警告的一种方法是在“@”字符前加上,当然这是一种黑客行为。
@$dom->saveHTML();
答案 1 :(得分:1)
您可以尝试从strictErrorChecking
关闭DOMDocument