去除HTML标签及其内容

15
我正在使用 DOM 来解析字符串。我需要一个函数,可以删除 span 标签及其内容。例如,如果我有以下内容:
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->nodeValue返回的是标签的值而不是整个标签,但我不知道如何获取整个带有类名的标签。

谢谢, Ile


如果您不需要使用DOM,请查看strip_tags手册中的注释。 - David Kuridža
你不能告诉 strip_tags 函数应该去除哪些标签,只能告诉它不要去除哪些标签。 - Lukáš Lalinský
没错,这就是为什么我提到了注释,其中可以找到去除标签的方法。 - David Kuridža
如果不是DOM,那我就得使用正则表达式。这并不是我真正想要的 :) - ilija veselica
3
好的,我会尽力为您翻译。以下是需要翻译的内容:+1 bonus point for not parsing HTML using regex - bobince
有什么线索可以将其转换为字符串而不是直接回显,以便我可以进一步操作它? - Ahmad Alfy
2个回答

9
尝试直接从DOM树中删除spans。
$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->saveHTML(); ... 你得认真学习一下PHP了... - Christian
虽然我来晚了,但这并不妨碍我理解内容。如果我使用上面的代码(将loadHTML更改为loadHTMLfile,并将'span'更改为'link'),所有我的<link>标签都会消失,但它们的内容仍然存在(即<link>http://www.something.com</link>变成了http://www.something.com)。 - Birrel
@Birrel 这不是因为 <link> 不是一个“成对出现”的元素,所以解析器不会期望它包含任何内容。尝试将你的 HTML 更改为其他标签,例如 <a>,这应该是用于链接的标签。 - Lukáš Lalinský
@LukášLalinský 我正在解析XML文件,它们的格式与常规网页不同。更具体地说,我正在解析RSS提要 - 它们有非常松散的标准化规则,因此从来没有两个是相同的。一个可能有<link>...</link>,而另一个可能有<link href="..." />。这令人沮丧,至少可以这么说。 - Birrel
@LukášLalinský 但是,你可能是对的,期望<link>标签是自闭合的,因此省略了它的尾部。我改为只提取我感兴趣的部分,然后在这个小块上进行暴力解析。这样做是安全的,现在可以工作了。 - Birrel
显示剩余2条评论

1
@ile - 我曾遇到过这个问题 - 这是因为foreach迭代器的索引会快乐地不断增加,而在DOM上调用removeChild()似乎也会将节点从DomNodeList($spans)中删除。因此,对于每个你移除的span,节点列表就会缩小一个元素,并且其foreach计数器也会增加一个。结果就是跳过了一个span。
我相信肯定有更加优雅的方法,但这就是我做的方式 - 我将DomNodeList中的引用移动到了第二个数组中,这样它们就不会被removeChild()操作删除。
    foreach($spans as $span) {
        $nodes[] = $span;
    }
    foreach($nodes as $span) {
        $span->parentNode->removeChild($span);
    }

我明白了... 虽然我必须承认我不知道foreach循环的工作原理。现在它变得更清晰了。 谢谢! - ilija veselica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接