获取变量中的所有行,直到遇到特定单词


getting all lines in variable until it comes across a specific word

这个想法是代码搜索行,当它找到匹配的行时,它会将其存储在变量中,然后将其写入文件。 当它找到匹配项时,是否有可能将所有行存储到变量中,直到在文本文件中遇到特定单词(并在此之后继续搜索匹配项)?
喜欢:

matchingline1
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
SPECIFICWORD
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
matchingline2
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
SPECIFICWORD
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager

结果:

matchingline1
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager    
matchingline2
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager

法典:

<?php
    $input = file("FILENAMEWITHDATA.TXT", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    $filter = file("FILTERINGFILE.TXT", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    $new_line = "'n";  // 'r'n
    $result = "";
    function pass_filter($line, $filter) {
           $i = count($filter);
           $res = false;
           while (--$i > -1 ) {
              if (strrpos($line, $filter[$i]) > 0){                                         
                    $res = true;
                    continue;
              }
           }
      return $res;
   }

for ($j = 0; $j < count($input); $j++) {
      if ( pass_filter($input[$j], $filter) ) {
         $result .= $input[$j] . $new_line . $input[($j+1)] . $new_line;
      }
   $j++;
}
file_put_contents("RESULT.TXT",$result);
?>

不能轻易地使用preg_match_all()来完成,工作示例代码可以在 http://sandbox.onlinephpfunctions.com/code/b9529471a3c1fe4a304295afbe440ca1ab137d61

<?php
$input = 'matchingline1
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
SPECIFICWORD
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
matchingline2
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
SPECIFICWORD
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager';
preg_match_all('/^(matchingline.*)SPECIFICWORD/msU', $input, $matches);
var_dump($matches[1]);

输出:

array(2) {
  [0]=>
  string(235) "matchingline1
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
"
  [1]=>
  string(400) "matchingline2
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
sdffadadfdfadafs randomlineoftext gdfwaweaddsfgreager
"
}

正则表达式的解释:

  • ^ = 从行首开始,后跟
  • (matchingline.*) = 匹配字符串 "matchingline" 和所有后续字符,后跟
  • SPECIFICWORD
  • = 匹配字符串"SPECIFICWORD"
  • /msU = 修饰符
    • m = 将字符串视为多行,使^匹配每行的开头,默认只匹配字符串的开头
    • s = 使.匹配任何字符,偶数换行符
    • U = 不贪婪,尽快停止

因此,此正则表达式匹配从一行开头开始的所有文本,该行以"matchingline"开头,直到找到字符串"SPECIFICWORD"。

使用括号(如 (matchingline.*))可以使此特定部分可访问,在我们的示例中使用 $matches[1] .

尝试这样的事情,

$searches = explode('SPECIFICWORD ', $all_text);

http://www.w3schools.com/php/func_string_explode.asp

尝试使用

fopen,然后使用 while 和 fgets 遍历行。

这将允许您迭代槽文件,一次读取一行。在迭代时,您可以检查行是否为空,是否等于搜索值,脚本是否应该收集下一行,或者行包含特定单词并停止收集。

循环后不要忘记关闭文件。

例:

function pass_filter($file, $startLine, $stopWord)
{
    if (!$handle = fopen($file, 'r')) {
        throw new Exception('Can''t open');
    }
    $collecting = false;
    $result = [];
    while($line = fgets($handle)) {
        $line = trim($line);
        if (strlen($line) === 0) {
            continue;
        }
        if ($line === $startLine) {
            $collecting = true;
        }
        if (strpos($line, $stopWord) !== false) {
            $collecting = false;
        }
        if ($collecting) {
            $result[] = $line;
        }
    }
    fclose($handle);
    return $result;
}