输入为html时,preg_replace返回null(但不是所有时间)

时间:2011-01-28 16:14:56

标签: php preg-replace

我正在阅读几个不同来源的HTML,我必须操纵它。作为其中的一部分,我有一些preg_replace()调用,我必须替换收到的html中的一些信息。

在我必须执行此操作的90%的网站上,一切正常,剩下的10%在每个preg_replace()调用上都返回NULL。

我已经尝试根据我发现的其他文章来增加pcre.backtrack_limit和pcre.recursion_limit,这些文章看起来有同样的问题,但这一直无济于事。

我输出的preg_last_error()返回'4',PHP文档根本没有证明是非常有用的,所以如果有人能说明这一点,它可能会开始指向正确的方向,但是我很难过。

其中一个令人不快的例子是:

$html = preg_replace('@<script[^>]*?.*?</script>@siu', '', $html);

但正如我所说,这种情况占90%的时间。

4 个答案:

答案 0 :(得分:2)

不要使用正则表达式解析HTML。使用真正的DOM解析器:

$dom = new DOMDocument;
$dom->loadHTML($html);
$scripts = $dom->getElementsByTagName('script');
while ($el = $scripts->item(0)) {
    $el->parentNode->removeChild($el);
}
$html = $dom->saveHTML();

答案 1 :(得分:0)

你有糟糕的utf-8。

/**
 * Returned by preg_last_error if the last error was
 * caused by malformed UTF-8 data (only when running a regex in UTF-8 mode). Available
 * since PHP 5.2.0.
 * @link http://php.net/manual/en/pcre.constants.php
 */
define ('PREG_BAD_UTF8_ERROR', 4);

但是,你真的不应该使用正则表达式来解析html。使用DOMDocument

编辑:如果不包括You can't parse [X]HTML with regex.

,我认为这个答案是不完整的

答案 2 :(得分:0)

您的#4错误是“PREG_BAD_UTF8_ERROR”,您应该检查导致此错误的网站上使用的字符集。

答案 3 :(得分:0)

您可能超出了回溯和/或内部递归限制。见http://php.net/manual/en/pcre.configuration.php

在preg_replace:

之前试试
ini_set('pcre.backtrack_limit', '10000000');
ini_set('pcre.recursion_limit', '10000000');