如何使用PHP读取外部文本文件中两个指定单词之间的值
嘿,这个需求我刚好折腾过,给你分享几个实用的PHP实现方案,灵活度拉满:
方案一:正则表达式(最灵活通用)
这是处理这类文本提取需求的首选,尤其是当文本格式可能有小变动的时候。思路是先定位到目标行,再用正则精准匹配两个关键词之间的数字:
// 读取TXT文件所有行到数组(跳过空行和换行符,节省内存) $lines = file('your_target_file.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); $extractedNumber = null; foreach ($lines as $line) { // 先筛选出开头符合要求的目标行 if (str_starts_with($line, 'The greatest expected 3 hr Kp for')) { // 正则匹配"is "和" (below"之间的数字(支持整数和小数) // 注意:如果实际文本里的空格、符号有差异,要调整正则里的匹配规则 if (preg_match('/is (\d+(?:\.\d+)?) \(below/', $line, $matches)) { $extractedNumber = $matches[1]; break; // 找到目标值就跳出循环,不用继续遍历 } } } // 输出结果 if ($extractedNumber !== null) { echo "提取到的数字:" . $extractedNumber; } else { echo "未找到符合条件的目标值"; }
正则说明:(\d+(?:\.\d+)?) 用来捕获整数或小数,\(below 是转义后的"(below"(因为括号在正则里是特殊字符,必须转义),确保精确匹配关键词边界。
方案二:字符串分割(简单直观)
如果你的TXT文本格式完全固定,不会有空格、符号的变动,用字符串分割会更简单,不需要写正则:
$lines = file('your_target_file.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); $extractedNumber = null; foreach ($lines as $line) { if (str_starts_with($line, 'The greatest expected 3 hr Kp for')) { // 第一步:截取"is "之后的所有内容 $afterIs = explode('is ', $line, 2)[1] ?? ''; // 第二步:截取"(below"之前的内容,就是我们要的数字 $extractedNumber = explode(' (below', $afterIs, 2)[0] ?? ''; // 额外验证:确保提取到的是数字 if (!is_numeric($extractedNumber)) { $extractedNumber = null; } break; } } // 输出结果 echo $extractedNumber !== null ? "提取到的数字:{$extractedNumber}" : "未找到目标值";
这个方法的好处是代码易懂,新手也能快速上手;缺点是对文本格式的变动容错率低,比如如果"is"后面多了个空格,或者"(below"前面少了空格,就会提取失败。
一些实用注意事项
- 确保PHP有目标TXT文件的读取权限,文件路径要写对(可以用绝对路径避免路径问题);
- 如果文件很大,用
file()逐行处理比file_get_contents()一次性把整个文件读进内存更高效; - 可以提前用
file_exists()和is_readable()检查文件是否存在且可读,避免报错; - 如果目标行的开头匹配有误差,可以用
str_contains()替代str_starts_with(),但这样可能会匹配到非目标行,需要根据实际情况调整。
内容的提问来源于stack exchange,提问作者TomHD
相关产品推荐
相关产品推荐

