去除 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->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->saveHTML();
... 说真的你需要多学一点 php...
聚会有点晚了,但这不会为我删除内容。如果我使用上面的代码(将loadHTML
更改为loadHTMLfile
,并将'span'
更改为'link'
)我所有的<link>
标签都会消失,但它们的内容仍然存在(即<link>http://www.something.com</link>
变为http://www.something.com
)跨度>
@Birrel 是不是因为<link>
不是“配对”元素,所以解析器不希望它包含任何内容。尝试将您的 HTML 更改为其他标签,例如<a>
无论如何都应该用于链接。
@LukášLalinský 我正在解析 XML 文件,它们与常规网页的格式不同。更具体地说,我正在解析 RSS 提要——它们的标准化规则非常松散,因此没有两个是相同的。一个可能有<link>...</link>
,而另一个可能有<link href="..." />
。至少可以这么说,这令人沮丧。【参考方案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 标签及其内容的主要内容,如果未能解决你的问题,请参考以下文章