PHP DOMDocument:获取节点的内部HTML

时间:2018-02-22 13:53:54

标签: php dom domdocument

将HTML加载到<textarea>时,我打算以不同方式处理不同类型的链接。请考虑以下链接:

  1. <a href="http://stackoverflow.com">http://stackoverflow.com</a>
  2. <a href="http://stackoverflow.com">StackOverflow</a>
  3. 当链接中的文本与其href attribute匹配时,我想删除HTML,否则HTML保持不变。

    这是我的代码:

    $body = "Some HTML with a <a href=\"http://stackoverflow.com\">http://stackoverflow.com</a>";
    
    $dom = new DOMDocument;
    $dom->loadHTML($body, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
    
    foreach ($dom->getElementsByTagName('a') as $node) {
        $link_text = $node->ownerDocument->saveHTML($node->childNodes[0]);
        $link_href = $node->getAttribute("href");
        $link_node = $dom->createTextNode($link_href);
    
        $node->parentNode->replaceChild($link_node, $node);
    }
    
    $html = $dom->saveHTML();
    

    上述代码的问题是DOMDocument将我的HTML封装到段落标记中:

    <p>Some HTML with a http://stackoverflow.com</p>
    

    如何获取它只返回该段落的内部HTML?

1 个答案:

答案 0 :(得分:1)

您需要拥有一个根节点才能拥有有效的DOM文档。

我建议您添加根节点<div>以避免破坏可能存在的根节点。

最后,加载rootNode的nodeValuesubstr()

$body = "Some HTML with a <a href=\"http://stackoverflow.com\">http://stackoverflow.com</a>";
$body = '<div>'.$body.'</div>';

$dom = new DOMDocument;
$dom->loadHTML($body, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

foreach ($dom->getElementsByTagName('a') as $node) {
    $link_text = $node->ownerDocument->saveHTML($node->childNodes[0]);
    $link_href = $node->getAttribute("href");
    $link_node = $dom->createTextNode($link_href);

    $node->parentNode->replaceChild($link_node, $node);
}

// or probably better :
$html = $dom->saveHTML() ;
$html = substr($html,5,-7); // remove <div>
var_dump($html); // "Some HTML with a http://stackoverflow.com"

这是输入字符串是:

<p>Some HTML with a <a href=\"http://stackoverflow.com\">http://stackoverflow.com</a></p>

输出:

<p>Some HTML with a http://stackoverflow.com</p>