去除 HTML 标签及其内容

Posted

技术标签:

【中文标题】去除 HTML 标签及其内容【英文标题】:Strip HTML tags and its contents 【发布时间】:2010-12-03 17:14:01 【问题描述】:

我正在使用 DOM 来解析字符串。我需要剥离跨度标签及其内容的功能。例如,如果我有:

This is some text that contains photo.
<span class='title'> photobyile</span>

我希望函数返回

This is some text that contains photo.

这是我尝试过的:

    $dom = new domDocument;
    $dom->loadhtml($string);
    $dom->preserveWhiteSpace = false;
    $spans = $dom->getElementsByTagName('span');

    foreach($spans as $span)
    
        $naslov = $span->nodeValue; 
        echo $naslov;

        $string = preg_replace("/$naslov/", " ", $string);
    

我知道$span-&gt;nodeValue 返回的是 span 标签的值而不是整个标签,但我不知道如何获取整个标签以及类名。

谢谢, 伊莱

【问题讨论】:

如果你不需要使用 DOM,可以在 strip_tags 手册中查看 cmets。 你不能告诉 strip_tags 它应该删除哪些标签,只有应该删除哪些标签。 正确,这就是为什么我提到了可以找到剥离标签方法的 cmets。 如果不是 DOM,我就必须使用正则表达式。这不是我真正想要的:) 不使用正则表达式解析 HTML 获得 +1 分 【参考方案1】:

尝试直接从 DOM 树中删除 span。

$dom = new DOMDocument();
$dom->loadHTML($string);
$dom->preserveWhiteSpace = false;

$elements = $dom->getElementsByTagName('span');
while($span = $elements->item(0))        
   $span->parentNode->removeChild($span);


echo $dom->saveHTML();

【讨论】:

而不是使用回声;有没有办法将它保存为变量中的字符串,以便我可以进一步操作它?谢谢 @AhmadAlfy $theVariable = $dom-&gt;saveHTML(); ... 说真的你需要多学一点 php... 聚会有点晚了,但这不会为我删除内容。如果我使用上面的代码(将loadHTML 更改为loadHTMLfile,并将'span' 更改为'link')我所有的&lt;link&gt; 标签都会消失,但它们的内容仍然存在(即&lt;link&gt;http://www.something.com&lt;/link&gt; 变为http://www.something.com)跨度> @Birrel 是不是因为&lt;link&gt; 不是“配对”元素,所以解析器不希望它包含任何内容。尝试将您的 HTML 更改为其他标签,例如&lt;a&gt; 无论如何都应该用于链接。 @LukášLalinský 我正在解析 XML 文件,它们与常规网页的格式不同。更具体地说,我正在解析 RSS 提要——它们的标准化规则非常松散,因此没有两个是相同的。一个可能有&lt;link&gt;...&lt;/link&gt;,而另一个可能有&lt;link href="..." /&gt;。至少可以这么说,这令人沮丧。【参考方案2】:

@ile - 我遇到了这个问题 - 这是因为 foreach 迭代器的索引愉快地不断增加,同时在 DOM 上调用 removeChild() 似乎也从 DomNodeList ($spans) 中删除了节点。因此,对于您删除的每个跨度,节点列表都会缩小一个元素,然后将其 foreach 计数器加一。最终结果:它跳过了一个跨度。

我确信有一种更优雅的方法,但我就是这样做的 - 我将引用从 DomNodeList 移动到第二个数组,在那里它们不会被 removeChild() 操作删除。

    foreach($spans as $span) 
        $nodes[] = $span;
    
    foreach($nodes as $span) 
        $span->parentNode->removeChild($span);
    

【讨论】:

我明白了...虽然,我必须承认我不知道 foreach 循环究竟是如何工作的。现在它更清楚了。谢谢!

以上是关于去除 HTML 标签及其内容的主要内容,如果未能解决你的问题,请参考以下文章

去除所有 HTML 标签,允许的除外

js处理富文本编辑器转义去除转义去除HTML标签

java去除文本内容的标签跟 

js去除html标签

laravel 文章去除html标签后显示

在离子中去除HTML标签?