我们在我们的网站上使用 CMS。许多用户将 HTML 内容添加到数据库中,但格式很奇怪。例如,将所有 HTML 放在一行中:
<h1>This is my title</h1><p>First paragraph</p><p>Second paragraph</p>
当然,这会在浏览器中正确呈现。但是,我正在用 PHP 编写一个脚本,将该数据加载到 DOMDocument 中,如下所示:
$doc = new DOMDocument();
$doc->loadHTML($row['body_html']);
var_dump($doc->documentElement->textContent);
这显示为:
This is my titleFirst paragraphSecond paragraph
如何让
documentElement
返回 innerText
,而不是 textContent
?我相信 innerText
将返回一个带有换行符的字符串。
正如cb0所说:
您应该迭代 DomDocument 中的所有元素并获取 逐项文本并手动插入空格。看一看 例如这里。 DomDocument 本身不知道它应该在哪里,但是 空格。
我编写了以下函数来递归遍历 DOMDocument 对象:
function get_text_from_dom($node, $text) {
if (!is_null($node->childNodes)) {
foreach ($node->childNodes as $node) {
$text = get_text_from_dom($node, $text);
}
}
else {
return $text . $node->textContent . ' ';
}
return $text;
}
并将问题中的代码替换为以下内容:
$doc = new DOMDocument();
$doc->loadHTML($row['body_html']);
var_dump(get_text_from_dom($doc->documentElement));
这是荣耀的。
答案就是节点值
$arrDivs = $dom->getElementsByTagName('div');
foreach($arrDivs as $div){
$text = $div->nodeValue;
echo $text . PHP_EOL . PHP_EOL;
}