我使用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 方法比正则表达式更安全、更稳定。