【问题标题】:strip_tags or preg_replace to remove few tags from html?strip_tags 或 preg_replace 从 html 中删除几个标签?
【发布时间】:2014-05-28 07:30:01
【问题描述】:

我在这两者之间进退两难。 我想从我通过curl 导入的页面中删除head 标签(以及内部/之前的所有内容,包括doctype/html)、body 标签和script 标签。 所以首先想到的是这个

$content = strip_tags($content, '<img><p><a><div><table><tbody><th><tr><td><br><span><h1><h2><h3><h4><h5><h6><code><pre><b><strong><ol><ul><li><em>'.$tags);

如您所见,使用 HTML5 标签、视频对象等可以变得更长。

比我在这里看到的。 https://stackoverflow.com/a/16377509/594423

谁能建议首选方法或展示您这样做的方式,请解释原因和 可能告诉我哪个更快。

谢谢!

【问题讨论】:

  • 也就是说,要提取body标签的内容?
  • 是的,完全正确,并将所有标签保留在正文中(脚本旁边)

标签: preg-replace strip-tags


【解决方案1】:

你可以这样测试:

$dom = new DOMDocument();
@$dom->loadHTML($content);

$result = '';

$bodyNode = $dom->getElementsByTagName('body')->item(0);

$scriptNodes = $bodyNode->getElementsByTagName('script');
$toRemove = array();

foreach ($scriptNodes as $scriptNode) {
    $toRemove[] = $scriptNode;
}

foreach($toRemove as $node) {
    $node->parentNode->removeChild($node);
}

$bodyChildren = $bodyNode->childNodes;

foreach($bodyChildren as $bodyChild) {
    $result .= $dom->saveHTML($bodyChild);
}

DOM 方法的优点是对多个 html 陷阱的相对可靠性,尤其是某些格式错误的标签或 javascript 字符串中的标签:var str = "&lt;body&gt;";

但是速度呢?

如果您使用正则表达式方法,例如:

$pattern = <<<'EOD'
~
<script[^>]*> (?>[^<]++|<(?!/script>))* </script>
|
</body>.*$
|
^ (?>[^<]++|<(?!body\b))* <body[^>]*>
~xis
EOD;

$result = preg_replace($pattern, '', $content);

结果要快一点(对于 400 行的 html 文件,从 1x 到 2x)。但是使用此代码,可靠性会降低。

如果速度很重要,并且您对 html 质量有很好的了解,对于与正则表达式版本相同的可靠性级别,您可以使用:

$offset = stripos($content, '<body');
$offset = strpos($content, '>', $offset);
$result = strrev(substr($content,++$offset));
$offset = stripos($result, '>ydob/<');
$result = substr($result, $offset+7);
$offset = 0;
while(false !== $offset = stripos($result, '>tpircs/<', $offset)) {
    $soffset = stripos($result, 'tpircs<', $offset);
    $result = substr_replace($result, '', $offset, $soffset-$offset+7);
}
$result = strrev($result);

这比 DOM 版本快 2 到 5 倍。

【讨论】:

  • Thnx 芽。与其他两个相比,速度如何?
  • 太棒了。我见过的最好的答案之一。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多