【问题标题】:Strip HTML tags and its contents去除 HTML 标签及其内容
【发布时间】: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 分

标签: php dom tags html strip


【解决方案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 循环究竟是如何工作的。现在它更清楚了。谢谢!
猜你喜欢
  • 2014-08-19
  • 2020-11-11
  • 1970-01-01
  • 2022-11-21
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
相关资源
最近更新 更多