如何使用PHP从文本文件中匹配指定起止位置的内容
解决方案
核心思路
- 调整正则匹配规则,限定仅检查行首跳过2个字符后的11位区间,避免整行匹配的误判
- 修正输出逻辑,避免多个匹配结果时切割错位
修改后的完整代码
<?php $file = 'masterfile.out'; $searchfor = '02354098780'; // 防止浏览器解析为HTML header('Content-Type: text/plain'); // 读取文件内容 $contents = file_get_contents($file); // 转义搜索内容里的正则特殊字符 $pattern = preg_quote($searchfor, '/'); // 正则调整:行首匹配2个任意字符后直接匹配目标内容,限定校验区间 $pattern = "/^.{2}{$pattern}/m"; // 执行匹配 if(preg_match_all($pattern, $contents, $matches)){ echo "匹配到结果:\n"; // 遍历每个匹配行单独截取,避免多结果拼接后切割错位 foreach ($matches[0] as $matchLine) { // 取前2位之后的11位,对应你要的区间内容 echo substr($matchLine, 2, 11) . "\n"; // 如果还需要取166位开始的11位,也对每行单独截取即可 // echo substr($matchLine, 166, 11) . "\n"; } } else{ echo "未匹配到结果"; } ?>
改动说明
- 正则规则优化:将原来整行模糊匹配的
/^.*$pattern.*$/m改为位置限定的规则,^匹配行开头,.{2}跳过行前2位字符,之后直接匹配目标字符串,刚好对应「第3位开始、长度11位」的校验要求,只有该区间匹配才会命中,不会因为行内其他位置出现相同字符串导致误判 - 输出逻辑修正:原来对所有匹配结果拼接后统一截取的逻辑,在有多个匹配结果时会出现内容错位,改为遍历每个匹配行单独截取,结果更准确
内容的提问来源于stack exchange,提问作者Jack Yuan
相关产品推荐
相关产品推荐

