如何在saveHTMLFile中阻止PHP对HTML编码标记?

时间:2012-12-14 18:10:18

标签: php dom character-encoding

我遇到一个小问题:标签,例如提交PHP DomDocument时,不会解析<br>标记。这是我的PHP代码:

$doc = new DOMDocument();
$doc->loadHTMLFile("Test.html");
$doc->formatOutput = true;
$node = new DOMElement('p', 'This is a test<br>This should be a new line in the same paragraph');
$doc->getElementsByTagName('body')->item(0)->appendChild($node);
$doc->saveHTMLFile("Test.html");
echo 'Editing successful.';

这是HTML代码(编辑前):

<!DOCTYPE html>
<html>
    <head>
        <title>Hey</title>
    </head>
    <body>
        <p>Test</p>   
    </body>
</html>

(编辑后)

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hey</title>
</head>
<body>
    <p>Test</p>   
<p>This is a test&lt;br&gt;This should be a new line in the same paragraph</p>
</body>
</html>

为什么不起作用?

2 个答案:

答案 0 :(得分:2)

您正在尝试附加一个fragment,它不能用作“普通”字符串(它怎么会知道您想要它编码什么而不是什么?)。

可以使用DOMDocumentFragment::appendXML()功能,但正如名称所述,它需要XML,而不是HTML,因此{{1} 需要自我关闭(因为我们在XML模式下工作):

<br>

另一个不涉及更改字符串的解决方案是将单独的文档作为HTML加载(<?php $doc = new DOMDocument(); $doc->loadHTMLFile("Test.html"); $doc->formatOutput = true; $node = new DOMElement('p'); $p = $doc->lastChild->lastChild->appendChild($node); $fragment = $doc->createDocumentFragment(); $fragment->appendXML('This is a test<br/>This should be a new line in the same paragraph'); $p->appendChild($fragment); $doc->saveHTMLFile("Test.html"); ,然后在主文档中循环导入:

$otherdoc->loadHTML('<html><body>'.$yourstring.'</body></html>')

答案 1 :(得分:0)

您是否尝试过<br/>而不是<br>?这可能与标记的有效性有关。 <br>无效。