簡體   English   中英

PHP DOMDocument:獲取節點的內部 HTML

[英]PHP DOMDocument: Get inner HTML of node

將 HTML 加載到<textarea> ,我打算以不同的方式對待不同類型的鏈接。 考慮以下鏈接:

  1. <a href="http://stackoverflow.com">http://stackoverflow.com</a>
  2. <a href="http://stackoverflow.com">StackOverflow</a>

當鏈接內的文本與其href屬性匹配時,我想刪除 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?

您需要有一個根節點才能擁有有效的 DOM 文檔。

我建議您添加一個根節點<div>以避免破壞可能存在的節點。

最后,加載 rootNode 或substr()nodeValue

$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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM