【发布时间】:2016-08-11 12:22:35
【问题描述】:
我在一个字符串中有 HTML。我想去掉其中的<head> 部分。我用:
$html = preg_replace("/<head[^>]*?>.*?<\/head>/s", "", $html);
但就性能而言,这可能有点重。有更好的选择吗?
我知道我可以使用strip_tags() 并在第二个参数中列出所有接受的标签,但是列出的太多了。
【问题讨论】:
-
您可以使用
strpos()来确定打开和关闭<head>标签的位置,然后获取子字符串,但我不确定这是否是更好的执行方式。 -
你可以写一个更好的正则表达式:) 就像
<head[^>]*?>[^<]*(?:<(?!\/head>)[^<]*)*<\/head>。与yours比较。 -
@WiktorStribiżew 就是这个!你能写出答案并解释它如何减少步骤等。非常令人印象深刻。我可以在同一个正则表达式中添加更多标签吗?就像
<head><header><nav>一样,我一口气将它们全部删除,而不是执行 3 次单独的 reg_replace() 运行。 -
@ᴳᵁᴵᴰᴼ:不幸的是,sax 在 PHP 中非常慢,只能与 XML 一起使用(与 XMLReader 相同,(来自 libxml 的拉式解析器,速度要快得多))。但由于 OP 似乎需要在他的 html 源上执行几项任务,使用 DOMDocument 不是问题,树构建的成本将被摊销。