PHP在文件中搜索字符串,并在匹配行上方/下方打印行

时间:2019-03-14 21:26:14

标签: php

问题:

我正在尝试在文件中搜索字符串,并且仅在匹配字符串的所有出现位置的上方仅显示第一行,而在匹配行下方仅打印第二行。有没有办法可以用PHP脚本实现这一目标? (将使用输出更新网页)无法通过外壳grep / awk找到解决方案,而我无法使用。

文件内容:

"timeUpdated":1533998971008
"name":"ABC"
"uptime":5143980267
"desiredStatus":"STARTED"
"lastReportedStatus":"STARTED"
"started":true
"serverArtifacts":[{"id":73
"timeUpdated":1525213888405
"name":"XYZ"
"uptime":6746828144F
"desiredStatus":"STARTED"
"lastReportedStatus":"STARTED"
"started":true 
"serverArtifacts":[{"id":21 
"timeUpdated":1544131291380
 "name":"KLM"
"uptime":6746828643
"desiredStatus":"STARTED"
"lastReportedStatus":"STARTED"
"started":true "serverArtifacts":[{"id":303
search for string: uptime -> print first line above (name:) and second line blow (lastReportedStatus:)
note: I can only use "uptime" as a search string since all other value pairs occur multiple times in a different sequence on other parts of the file.
expected output:
"name":"ABC"
"lastReportedStatus":"STARTED"
"name":"XYZ"
"lastReportedStatus":"STARTED"
"name":"KLM"
"lastReportedStatus":"STARTED"

1 个答案:

答案 0 :(得分:0)

如果将文件中的行读入数组:

$lines = file('file.txt', FILE_IGNORE_NEW_LINES);

然后,您可以在遍历数组时跟踪键,并通过对键进行简单的加/减来找到与“正常运行时间”相对的行。

foreach ($lines as $key => $line) {
    if (substr(trim($line),0, 8) == '"uptime"') {
        $result[] = $lines[$key - 1];
        $result[] = $lines[$key + 2] ?? '';
    }
}

如果文件的每一行之间确实存在空白行,则可能需要向FILE_SKIP_EMPTY_LINES添加file()选项。我不确定这里的问题是否就是这样。

不过,我很好奇文件数据的来源。它与JSON非常接近,如果有任何方法可以从源头上获取其余信息,那么我们在这里就不必用这种笨拙的方式来处理它了。该代码将适用于您显示的示例,但这并不理想。