PHP正则匹配含换行文本 提取搜索词对应-wordpagefound后的页码
问题场景
现有OCR识别文本样例如下:
-wordpagefound: 1 offerte 201135455 fam. gaudino, umbau wohnung, winterthur seite 3 von 17 rektifikat projekt 7514505 pos.nr menge uberschrift artikelnummer richtpreis betrag me bild artikelbeschreibung exkl. mwst exkl. mwst dusche - wc eltern
核心需求:搜索指定关键词(例如wc)时,获取该关键词所在位置前最近的-wordpagefound:标识后紧跟的页码数字,匹配逻辑需兼容文本换行,适配OCR文本处理场景。
原有实现代码如下,因换行问题匹配失败:
preg_match_all('/(-wordpagefound).*([0-9]).*('.$searchText.')/mi', $file->text, $matches, PREG_OFFSET_CAPTURE)
匹配失败原因
- 正则默认模式下,元字符
.不匹配换行符,跨换行的文本段会直接中断匹配 - 原有正则使用贪婪匹配逻辑,会优先匹配文本中最靠前的
-wordpagefound:标识,无法定位离关键词最近的上一个标识 - 页码匹配规则粗糙,
[0-9]仅支持单数字页码,遇到多位数页码会出现捕获错误 - 未对搜索关键词做正则转义,关键词含正则特殊字符时会直接导致正则报错
可行修复方案
替换原有正则规则即可,完整实现代码:
// 转义搜索关键词中的正则特殊字符,避免规则报错 $safeSearchText = preg_quote($searchText, '/'); // 匹配规则 $pattern = '/-wordpagefound:\s*(\d+)(?:(?!-wordpagefound:).)*?'.$safeSearchText.'/is'; preg_match_all($pattern, $file->text, $matches); // 提取到的对应页码存在$matches[1]数组中 $pageNums = $matches[1];
规则说明:
- 增加
s修饰符:让.可以匹配包括换行符在内的所有字符,解决跨换行匹配失败的问题 - 保留
i修饰符:不区分大小写匹配,适配OCR识别可能出现的大小写偏差 - 加入
(?:(?!-wordpagefound:).)*?惰性负向预查逻辑:匹配中间内容时一旦遇到新的-wordpagefound:标识就停止,保证捕获的是离关键词最近的上一个页码 - 用
\s*(\d+)匹配页码:支持捕获多位数字页码,适配不同长度的页码场景
针对给出的样例文本,搜索关键词wc时,最终捕获到的页码值为1,符合需求预期。
内容的提问来源于stack exchange,提问作者DuliNini
相关产品推荐
相关产品推荐

