PHP DOMDocument:获取节点的内部 HTML
PHP DOMDocument: Get inner HTML of node
当将 HTML 加载到 <textarea>
时,我打算区别对待不同类型的 link。考虑以下 links:
<a href="http://whosebug.com">http://whosebug.com</a>
<a href="http://whosebug.com">Whosebug</a>
当 link 中的文本与其 href
属性匹配时,我想删除 HTML,否则 HTML 保持不变。
这是我的代码:
$body = "Some HTML with a <a href=\"http://whosebug.com\">http://whosebug.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://whosebug.com</p>
我如何仅在该段的 return 内部 HTML 获取它?
您需要有根节点才能拥有有效的 DOM 文档。
我建议你添加一个根节点<div>
以避免破坏一个可能存在的节点。
最后加载根节点的nodeValue
或者substr()
。
$body = "Some HTML with a <a href=\"http://whosebug.com\">http://whosebug.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://whosebug.com"
这是有效的,输入字符串是:
<p>Some HTML with a <a href=\"http://whosebug.com\">http://whosebug.com</a></p>
输出:
<p>Some HTML with a http://whosebug.com</p>
当将 HTML 加载到 <textarea>
时,我打算区别对待不同类型的 link。考虑以下 links:
<a href="http://whosebug.com">http://whosebug.com</a>
<a href="http://whosebug.com">Whosebug</a>
当 link 中的文本与其 href
属性匹配时,我想删除 HTML,否则 HTML 保持不变。
这是我的代码:
$body = "Some HTML with a <a href=\"http://whosebug.com\">http://whosebug.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://whosebug.com</p>
我如何仅在该段的 return 内部 HTML 获取它?
您需要有根节点才能拥有有效的 DOM 文档。
我建议你添加一个根节点<div>
以避免破坏一个可能存在的节点。
最后加载根节点的nodeValue
或者substr()
。
$body = "Some HTML with a <a href=\"http://whosebug.com\">http://whosebug.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://whosebug.com"
这是有效的,输入字符串是:
<p>Some HTML with a <a href=\"http://whosebug.com\">http://whosebug.com</a></p>
输出:
<p>Some HTML with a http://whosebug.com</p>