PHP:strip_tags - 仅删除某些标签(及其内容)


PHP: strip_tags - remove only certain tags (and their contents)?

我使用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>");但是我正在抓取的html和需要删除的标签一直不同。

搜索了几个小时来寻找适合我需求的功能,但找不到任何有用的东西。

有什么想法吗?

使用正则表达式。这样的事情应该有效:

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

演示显示它用任何内容替换所需的标签。

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

以下是用于捕获带或不带属性的标签的正则表达式:

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

你说你正在使用简单的HTML DOM(好! 这是解析 HTML 的正确方法)。 当我需要删除标签及其内容时,我会:

$rows = $html->find("span");
foreach ($rows as $row)
{
  $row->outertext = "";
}
$html->load($html->save());

最后一行是必需的,因为修改后 DOM 会变得混乱,因此必须折叠整个 DOM 然后再次解析,以便更改成为永久性的(IMO,简单 HTML DOM 中的一个错误)。

简单 HTML DOM 方法比正则表达式更安全、更稳定。