如何使用 PHP 的 DOMDocument 从 HTML 字符串中剥离标签(及其内容)?
How does one strip tags (and their content) from an HTML string using PHP's DOMDocument?
我想从 HTML 字符串中删除所有链接 及其内容。
所以这个...
<a href="#">LINK1</a> and <i>also</i> <a href="#">LINK2</a>
... 应该变成这样:and <i>also</i>
以下...
$html = '<a href="#">LINK1</a> - and <i>also</i> <a href="#">LINK2</a>';
$dom = new DOMDocument;
$dom->preserveWhiteSpace = false;
$dom->validateOnParse = false;
$dom->resolveExternals = false;
$dom->substituteEntities = false;
$dom->loadHTML( $html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD );
$list = $dom->getElementsByTagName('a');
while ($list->length > 0) {
$p = $list->item(0);
$p->parentNode->removeChild($p);
}
$html_new = $dom->saveHTML();
echo htmlentities($html);
echo '<br><br><hr><br>';
echo htmlentities($html_new);
... 不起作用,除非我将 $html
包装在 <div>
中,但我有 <div> and <i>also</i> </div>
。我可以使用 substr
从结果中删除前 5 个和最后 6 个字符,但这太愚蠢了,而且我的脸已经因为我试图弄清楚上面的问题而忍受的所有面部表情而感到疼痛。
关于如何在不使用正则表达式或诉诸 facepalmy hack 的情况下从字符串中去除所有标签的建议?
根据 Niet the Dark Absol 的评论,我的解决方案是简单地将我的代码 nippet 包装在 div
中,然后使用 substr
删除它。似乎是通过 DOMDocument.
使用有效内联 HTML 片段(而不是整个 DOM)的可接受的解决方法
$html = '<a href="#">LINK1</a> - and <i>also</i> <a href="#">LINK2</a>';
$dom = new DOMDocument;
$dom->preserveWhiteSpace = false;
$dom->validateOnParse = false;
$dom->resolveExternals = false;
$dom->substituteEntities = false;
$dom->loadHTML( '<div>'.$html.'</div>', LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD );
$list = $dom->getElementsByTagName('a');
while ($list->length > 0) {
$p = $list->item(0);
$p->parentNode->removeChild($p);
}
$result = substr($dom->saveHTML(), 5, -6);
我想从 HTML 字符串中删除所有链接 及其内容。
所以这个...
<a href="#">LINK1</a> and <i>also</i> <a href="#">LINK2</a>
... 应该变成这样:and <i>also</i>
以下...
$html = '<a href="#">LINK1</a> - and <i>also</i> <a href="#">LINK2</a>';
$dom = new DOMDocument;
$dom->preserveWhiteSpace = false;
$dom->validateOnParse = false;
$dom->resolveExternals = false;
$dom->substituteEntities = false;
$dom->loadHTML( $html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD );
$list = $dom->getElementsByTagName('a');
while ($list->length > 0) {
$p = $list->item(0);
$p->parentNode->removeChild($p);
}
$html_new = $dom->saveHTML();
echo htmlentities($html);
echo '<br><br><hr><br>';
echo htmlentities($html_new);
... 不起作用,除非我将 $html
包装在 <div>
中,但我有 <div> and <i>also</i> </div>
。我可以使用 substr
从结果中删除前 5 个和最后 6 个字符,但这太愚蠢了,而且我的脸已经因为我试图弄清楚上面的问题而忍受的所有面部表情而感到疼痛。
关于如何在不使用正则表达式或诉诸 facepalmy hack 的情况下从字符串中去除所有标签的建议?
根据 Niet the Dark Absol 的评论,我的解决方案是简单地将我的代码 nippet 包装在 div
中,然后使用 substr
删除它。似乎是通过 DOMDocument.
$html = '<a href="#">LINK1</a> - and <i>also</i> <a href="#">LINK2</a>';
$dom = new DOMDocument;
$dom->preserveWhiteSpace = false;
$dom->validateOnParse = false;
$dom->resolveExternals = false;
$dom->substituteEntities = false;
$dom->loadHTML( '<div>'.$html.'</div>', LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD );
$list = $dom->getElementsByTagName('a');
while ($list->length > 0) {
$p = $list->item(0);
$p->parentNode->removeChild($p);
}
$result = substr($dom->saveHTML(), 5, -6);