编辑:我知道这是一个难以复制的问题,但如果有人可以就这个问题可能的原因提出建议,那将非常有用。
编辑:根据要求,这里是$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()
无济于事。
任何人都能解释为什么我会得到假的吗?
答案 0 :(得分:0)
您的源示例不完整,因此很难找到此问题。最可能的原因,即使你使用它的例子工作正常,是你的模式有问题。您的模式是否在循环中的某个点发生变化? preg_match_all()将返回 FALSE ,如果您指定的模式无法编译,preg_last_error()将返回 PREG_NO_ERROR 。
还有其他边缘情况,但这似乎最有可能。你能更新$ content的链接并提供while循环的完整源代码吗?
答案 1 :(得分:0)
您可以使用的模式大小有限制。
编译的最大长度 如果PCRE,模式是65539(sic)字节 使用默认内部编译 连接大小2.如果你想 处理正则表达式 真的很大,你可以编译 PCRE的内部链接大小为 3或4(参见自述文件中的自述文件) 源代码分发和pcrebuild 文档详情)。在这些 案件的限制是实质性的 大。但是,速度 执行速度较慢。