2017-03-02 84 views
0

我们在我们的网站上使用CMS。许多用户将HTML内容添加到奇怪格式化的数据库中。例如,将所有的HTML放在一行上:如何在PHP中获得DOMElement的innerText?

<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将返回带换行符的字符串。

+1

您应该迭代DomDocument中的所有元素,并逐项获取文本项并手动插入空格。例如,看看[这里](http://stackoverflow.com/questions/191923/how-do-i-iterate-through-dom-elements-in-php)。 DomDocument本身不知道它应该在哪里,而是在空白处。 – cb0

回答

0

正如CB0说:

你应该遍历在DOM文档的所有元素,并通过项目获得 文本项目和手动插入空格。例如,看看 here。 DomDocument本身不知道它应该在哪里,但是空白区域应该是 。

我写了下面的函数来递归遍历DOM文档对象:

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)); 

这是光荣的。