preg_last_error()在出现错误时说没有错误

时间:2011-02-13 22:39:49

标签: php regex preg-match-all

编辑:我知道这是一个难以复制的问题,但如果有人可以就这个问题可能的原因提出建议,那将非常有用。

编辑:根据要求,这里是$content

http://pastebin.com/raw.php?i=tHecParp

这是一个提取的网页。 create|exited|deleted|updated是样本,我正在寻找关键字المحتجين。

以下代码在while循环中连续运行:

$pattern = "/(create|exited|deleted|updated)/";
$num_found = preg_match_all( $pattern, $content, $matches );

var_dump( $num_found );

if( $num_found === false )
{
    if (preg_last_error() == PREG_NO_ERROR) {
        var_dump( 'There is no error.' );
    }
    else if (preg_last_error() == PREG_INTERNAL_ERROR) {
        var_dump( 'There is an internal error!' );
    }
    else if (preg_last_error() == PREG_BACKTRACK_LIMIT_ERROR) {
        var_dump( 'Backtrack limit was exhausted!' );
    }
    else if (preg_last_error() == PREG_RECURSION_LIMIT_ERROR) {
        var_dump( 'Recursion limit was exhausted!' );
    }
    else if (preg_last_error() == PREG_BAD_UTF8_ERROR) {
        var_dump( 'Bad UTF8 error!' );
    }
    else if (preg_last_error() == PREG_BAD_UTF8_ERROR) {
        var_dump( 'Bad UTF8 offset error!' );
    }
}

我只是在阅读$content文本文件中寻找一些关键字。

输出

int(1)
int(1)
int(1)
int(1)
int(1)
bool(false)
string(18) "There is no error."
bool(false)
string(18) "There is no error."
bool(false)
string(18) "There is no error."

它会多次找到一个关键字,然后开始返回false。 在测试时,我保持$content不变。所以它必须继续找到关键字,而不是返回false。但是preg_last_error()无济于事。

任何人都能解释为什么我会得到假的吗?

2 个答案:

答案 0 :(得分:0)

您的源示例不完整,因此很难找到此问题。最可能的原因,即使你使用它的例子工作正常,是你的模式有问题。您的模式是否在循环中的某个点发生变化? preg_match_all()将返回 FALSE ,如果您指定的模式无法编译,preg_last_error()将返回 PREG_NO_ERROR

还有其他边缘情况,但这似乎最有可能。你能更新$ content的链接并提供while循环的完整源代码吗?

答案 1 :(得分:0)

PCRE Limit had exceeded.

您可以使用的模式大小有限制。

  

编译的最大长度   如果PCRE,模式是65539(sic)字节   使用默认内部编译   连接大小2.如果你想   处理正则表达式   真的很大,你可以编译   PCRE的内部链接大小为   3或4(参见自述文件中的自述文件)   源代码分发和pcrebuild   文档详情)。在这些   案件的限制是实质性的   大。但是,速度   执行速度较慢。

http://www.pcre.org/pcre.txt