php - 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 上失败。这只是一个错误,还是我需要使用一些我不知道的标志?
解决方案
似乎问题与文件中流的大小有关。当我使用 file_get_contents 读取文件并在其上运行 preg_match_all 时,我从 preg_match 收到回溯限制错误,但是当我从 notepad++ 中复制文本并粘贴到提供相同正则表达式的 Web 表单中时,我没有。当我粘贴它时,它读取为 UTF8,因此字符较少,所以我没有达到回溯限制。该流的大小刚好足够大,可以用作 UTF8,但我会在稍长的 ANSI 文本上达到回溯限制。
最终,我最终更改了正则表达式以仅搜索对象的开头,然后使用 strpos 查找结尾。结果证明这是一种比 ([0-9]+ [0-9]+) obj(.*?)endobj 更有效的方法
推荐阅读
- r - 有没有办法使用 terra 包中的 rast 函数从带有缓冲区的栅格中提取数据?
- html - 在列中堆叠时,弹性项目的底部被切断
- r - 当我尝试在没有 geom_point() 的情况下使用 state_smooth() 时,Y 轴消失
- javascript - javascript渲染图像时如何从webview获取图像?
- android - 回收站视图数据未加载到屏幕上
- postgresql - 配置文件包含错误
- r - Partially suppress labels in R
- java - 为什么生成的带有 PDF 框的 PDF 表单与多行文本框结果在云服务器上看起来不同?
- ios - 自定义 UINavigationBar 渐变背景和徽标中的图像
- three.js - aframe,TransformControls 不适用于 3D 对象