首页 > 解决方案 > PHP preg_match_all 在二进制数据上失败

问题描述

我正在尝试使用 preg_match_all 查找 pdf 文件中的所有对象。我正在使用以下正则表达式,它返回我知道存在的 700 个匹配项中的 2 个:

preg_match_all('/[0-9]+ [0-9]+ obj\r\n(.*?)endobj/s', $data, $matches);

使用相同的正则表达式在 python 中有效,但如果使用 PHP 匹配,这似乎在 windows 和 linux 上失败。这只是一个错误,还是我需要使用一些我不知道的标志?

标签: phpregex

解决方案


似乎问题与文件中流的大小有关。当我使用 file_get_contents 读取文件并在其上运行 preg_match_all 时,我从 preg_match 收到回溯限制错误,但是当我从 notepad++ 中复制文本并粘贴到提供相同正则表达式的 Web 表单中时,我没有。当我粘贴它时,它读取为 UTF8,因此字符较少,所以我没有达到回溯限制。该流的大小刚好足够大,可以用作 UTF8,但我会在稍长的 ANSI 文本上达到回溯限制。

最终,我最终更改了正则表达式以仅搜索对象的开头,然后使用 strpos 查找结尾。结果证明这是一种比 ([0-9]+ [0-9]+) obj(.*?)endobj 更有效的方法


推荐阅读