你可以这样测试:
$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 = "<body>";
但是速度呢?
如果您使用正则表达式方法,例如:
$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 倍。