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

时间:2012-06-23 00:56:04

标签: php web-scraping strip-tags

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

我搜索了几个小时的功能以满足我的需求,但找不到任何有用的功能。

有什么想法吗?

2 个答案:

答案 0 :(得分:11)

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

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

demo显示它没有替换所需的标签。

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

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

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

答案 1 :(得分:1)

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

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

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

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

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

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