【发布时间】:2019-12-07 03:11:21
【问题描述】:
这让我发疯了......
我有以下代码:
# open pdf
$pdf = file_get_contents('myfile.pdf');
echo("RE 1:\n");
preg_match('/^[0-9]+ 0 obj.*\/Contents \[ ([0-9]+ [0-9]+) R \\]/msU', $pdf, $m);
var_dump($m);
echo("\nRE 2:\n");
preg_match('/^8 0 obj.*\/Contents \[ ([0-9]+ [0-9]+) R \\]/msU', $pdf, $m);
var_dump($m);
文件 myfile.pdf 包含以下文本:
...
8 0 obj
<<
/Type /Page
/Parent 2 0 R
/Resources 6 0 R
/Contents [ 5 0 R ]
>>
endobj
...
这两个正则表达式之间的唯一区别是字符串开头的数字范围。然而我得到以下输出:
RE 1:
array(0) {
}
RE 2:
array(2) {
[0]=>
string(78) "8 0 obj
<<
/Type /Page
/Parent 2 0 R
/Resources 6 0 R
/Contents [ 5 0 R ]"
[1]=>
string(3) "5 0"
}
我希望两个正则表达式都返回相似的结果,但是以数字范围开头的正则表达式 (RE 1) 不会返回任何结果。这是一个错误还是我做错了什么?
更新
添加preg_last_error() 后,我得到PREG_BACKTRACK_LIMIT_ERROR。我该如何解决?
【问题讨论】:
-
@Emma 是的,这就是我想要捕捉的。它在 regex101.com 上完美运行,但在我的代码中却不行。
-
您的两个正则表达式在sandbox.onlinephpfunctions.com 都可以正常工作,所以可能是您的 PHP 或 PCRE 版本引起了头痛?
-
尝试使用
preg_last_error()看看它是否能给你任何提示。 -
@MonkeyZeus 好电话!我收到 PREG_BACKTRACK_LIMIT_ERROR。
-
检查您的
php.ini文件并查看pcre.backtrack_limit的设置,如果您无权访问php.ini,请使用echo ini_get( 'pcre.backtrack_limit' );