我使用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和需要删除的标签一直不同。
我搜索了几个小时的功能以满足我的需求,但找不到任何有用的功能。
有什么想法吗?
答案 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方法比正则表达式更安全,更稳定。