PHP: strip_tags - 只删除特定标签(及其内容)?

10

我使用strip_tags()函数,但我需要删除某些标签(以及它们的所有内容)。

例如:

<div>
  <p class="test">
    Test A
  </p>
  <span>
    Test B
  </span>
  <div>
    Test C
  </div>
</div>

假设我需要去掉P和SPAN标签,只保留文本:

<div>
  <div>
    Test C
  </div>
</div>

strip_tags函数的第二个参数指定需要保留的标签。

在这个例子中,可以使用striptags($html, "<div>");来移除特定标签,但我需要移除的标签每次都不同。

我搜索了几个小时,但没找到适合我的需求的函数。

有什么好的想法吗?


2
DOMXPath开始。 - DaveRandom
1
问题已在此处得到回答:https://dev59.com/EmHVa4cB1Zd3GeqPp8A0 - Jocelyn
我尝试了这篇帖子中被接受的答案,但对结果不满意。 - Dylan
2个回答

11

使用正则表达式。像这样的东西应该可以工作:

$tags = array( 'p', 'span');
$text = preg_replace( '#<(' . implode( '|', $tags) . ')>.*?<\/$1>#s', '', $text);

演示显示了它将目标标签替换为无。

请注意,您可能需要进行更多的调整,例如,以弥补标签内的空格或其他示例未演示的未知因素。

这是要使用的正则表达式,用于捕获具有或不带属性的标签:

'#<(' . implode( '|', $tags) . ')(?:[^>]+)?>.*?<\/$1>#s'

@Downvoter - 请问我的功能答案为什么被踩了? - nickb
2
谢谢,这正适合我的情况。我正在使用简单的HTML DOM解析器进行网页抓取,只需要一些额外的剥离处理。 - Dylan
@Dylan - 你的示例没有包括属性 - 如果你想匹配它们,你应该使用:'#<(' . implode( '|', $tags) . ')[^>]+>.*?</\1>#s' - nickb
1
我同意,我只是不想关闭这个问题,希望能得到更多的答案。你的正则表达式现在包括带属性的标签,但对于没有属性的标签不再起作用。我对正则表达式的了解很遗憾不足以修复它。 - Dylan
1
更新:使用 '#<(' . implode( '|', $tags) . ')[^>]?>.?</\1>#s',似乎可以处理带有和不带有属性的标签。 - Dylan
显示剩余3条评论

1

您说您正在使用Simple HTML DOM(很好!这是解析HTML的正确方式)。当我需要删除一个标签及其内容时,我会执行以下操作:

$rows = $html->find("span");

foreach ($rows as $row)
{
  $row->outertext = "";
}

$html->load($html->save());

最后一行是必需的,因为在进行修改后DOM会变得混乱,所以整个DOM必须被折叠然后再次解析,以便更改是永久的(在我看来,这是Simple HTML DOM中的一个错误)。

与正则表达式相比,Simple HTML DOM方法更安全、更稳定。


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