数据库的值为:This is a test.<br><h1>this is also a test.</h1>This is a test.<br>this is a test.<br>
使用mysql,值由$DBval['test']
给出。
行设置为:
Type = LONGTEXT
排序规则= UTF8_general_ci
$doc = new DOMDocument(); $test = $doc->createElement("div"); $doc->appendChild($test); $test_value = $doc->createElement("p", $DBval['test']); $test->appendChild($test_value); echo $doc->saveXML();
结果:
"This is a test.<br><h1>this is also a test.</h1>This is a test.<br>this is a test.<br>"
结果用纯文本写成,奇怪的是双引号。
我只想将结果写成HTML,如下所示:
这是一个测试。
这也是一个测试。
这是一个 测试。
这是一个测试。
答案 0 :(得分:2)
有几个原因可以解决这个问题(至少和预期一样)
您可以通过将DOMElement传递给saveHTML($ text_value)来回显该元素,这样您就不会回显所有文档。
考虑到domDocuemnt将会解除任何“自由浮动”状态。将文字转换为<p>
标记。在这种仅文本节点的情况下,您应使用 - &gt; createTextNode()而不是。
现在,这是一个棘手的部分:你可以这样做:
$doc = new DOMDocument();
$doc->loadHTML($DBval['test']);
echo $doc->saveHTML();
但如果你想真正导入&#39; html到另一个DOMElement你需要导入它。这里使用了一个函数(为你的案例添加了一个函数,并为解释进行了评论)
//For a valid html5 DOCTYPE declaration
//$doc = new DOMDocument();
$dom = new DOMImplementation;
$doc = $dom->createDocument(null, 'html', $dom->createDocumentType('html'));
//To keep thing tidy
$doc->preserveWhiteSpace = false;
$doc->formatOutput = true;
$doc->encoding = 'utf8';
//Creates your test div
$test = $doc->createElement("div");
$doc->appendChild($test);
/** HERE STARTS THE MAGIC */
$tempDoc= new DOMDocument; //Create a temp Doc to import the new html
libxml_use_internal_errors(true); //This prevent some garbage warning.
//Prevent encoding garbage on import, change accordingly to your setup
$htmlToImport = mb_convert_encoding($DBval['test'], 'HTML-ENTITIES', 'utf8');
//Load your Html into the temp document
//As commented, we'll encapsulate the html in a span to prevent DOM to automaticly add the 'p' tag
$tempDoc->loadHTML('<span>'.$htmlToImport.'</span>');
//$tempDoc->loadHTML($htmlToImport); //@REMOVED: was adding 'p' tag
//Restore Garbage Warning report
libxml_clear_errors();
libxml_use_internal_errors(false);
//Get the htl to import now sotred in the body of the temp document
$bodyToImport = $tempDoc->getElementsByTagName('body')->item(0);
//Import all those new childs to your div
foreach($bodyToImport->childNodes as $node){
$test->appendChild($doc->importNode($node->cloneNode(true),true));
}
/** All this to replace these 2 lines :(
$test_value = $doc->createElement("p", $DBval['test']);
$test->appendChild($test_value);
*/
//echo $doc->saveXML();
echo $doc->saveHTML(); //echo all the document
//echo $doc->saveHTML($test); //echo only the test 'div'
我使用了“垃圾”这个术语。因为你可以忽略这是一个可怕的错误,但是当你开发时,你可能会看看那些错误。
我知道这看起来有些过分,但这是我设法使用任何HTML,charset并使其以干净的方式工作的唯一方式。
真的希望这会有所帮助。 DOM可能很棘手,但如果使用得当,它具有保持结构的能力。