9

我使用该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 和需要删除的标签一直都是不同的。

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

有任何想法吗?

4

2 回答 2

10

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

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

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

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

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

'#<(' . implode( '|', $tags) . ')(?:[^>]+)?>.*?<\/$1>#s'
于 2012-06-23T01:04:49.970 回答
1

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

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

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

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

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

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

于 2012-06-27T15:25:31.150 回答