You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 14:45:43