【问题标题】:Get a line after match found in PHP在 PHP 中找到匹配后获取一行
【发布时间】:2014-03-17 20:59:12
【问题描述】:

我有一个文本文件,它总是包含以下行:

CODICE FISCALE DATA DI STAMPA

01097800625

...
...

CODICE FISCALE

FRRVCN68S14E487E <------------------------I need this line
DATA ASSUNZIONE DATA

我会解析文本以获得标记的行。我试图分解“CODICE FISCALE”和“DATA ASSUNZIONE DATA”之间的文本,但它不起作用。 有什么建议吗?

function getBetween($content,$start,$end){
    $r = explode($start, $content);

    if (isset($r[1])){
        $r = explode($end, $r[1]);
        return $r[0];
    }
    return '';
}
$newName     = getBetween($fileContent,'CODICE FISCALE','DATA ASSUNZIONE DATA');

【问题讨论】:

    标签: php regex parsing


    【解决方案1】:

    您可以通过以下代码使用简单的explode() 来做到这一点

    $file_content = file_get_contents("your_file.txt");
    $file_content_separated_by_special_word = explode("\nCODICE FISCALE", $file_content);
    $res = explode("\n", ltrim($file_content_separated_by_special_word[1]));
    

    我因“\nCODICE FISCALE”而爆炸,因为“CODICE FISCALE”在第一次出现时爆炸。

    你可以看到工作演示here

    【讨论】:

    • @giuseppe 这实际上是您问题的最直接答案。只需在 $start 和 $end 前面加上 "\n" 就可以了
    【解决方案2】:

    使用fegts,您可以从文件中获取单曲。如果找到“DATA ASSUNZIONE DATA”行,您可以构建类似流解析器的东西并设置标记。然后返回或存储下一个非空行并重置该标记。这样,您还可以在具有多个块的文件中找到这些行('CODICE FISCALE ... DATA ASSUNZIONE DATA')。

    查看this JSON parsers source 上的示例,以获取如何设置此类脚本的灵感。

    【讨论】:

      【解决方案3】:

      这个函数会获取一些文本后面的行,如果没有找到则返回null。

      function getLineAfter($file_path, $line) {
          $lines = file($file_path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
          if (($key = array_search($line, $lines)) !== false && isset($lines[$key + 1])) {
              return $lines[$key + 1];
          }
          return null;
      }
      

      用法:

      echo getLineAfter('somefile.txt', 'CODICE FISCALE');
      

      【讨论】:

        【解决方案4】:

        虽然我更喜欢其他解决方案,但如果您想使用正则表达式,您可以使用

        /^CODICE FISCALE\n([\s\S]+)DATA ASSUNZIONE DATA/m
        

        demo @ phpliveregex
        demo @ regex101

        例如使用preg_match_all:

        preg_match_all("/^CODICE FISCALE\n([\s\S]+)DATA ASSUNZIONE DATA/m", $input_lines, $output_array);
        

        你甚至可以重构你的 getBetween 函数:

        function getBetween($content,$start,$end){  
            preg_match_all("/^".$start."\n([\s\S]+)".$end."/m", $content, $output);
            return $output;
        }
        

        working example @ phpfiddle

        【讨论】:

          【解决方案5】:
          preg_match('/CODICE FISCALE\n(.*?)DATA ASSUNZIONE DATA/s', $fileContent, $match);
          $match[1] contains your line.
          

          在此处查看演示:Demo

          【讨论】:

          • 谢谢。如果我也匹配行中字符的确切数量?在示例中,它是 16...
          • preg_match('/CODICE FISCALE\n(.{0,16}).*?DATA ASSUNZIONE DATA/s', $fileContent, $match);
          【解决方案6】:

          建议您尝试使用preg_match(),而不是explode()(文档可以是found here)。

          这是显示它的 PHP 代码:

          $string = <<<EOS
          CODICE FISCALE DATA DI STAMPA
          
          01097800625
          
          ...
          ...
          
          CODICE FISCALE
          
          FRRVCN68S14E487E
          DATA ASSUNZIONE DATA
          EOS;
          
          preg_match("/\n(.*)\nDATA ASSUNZIONE DATA/", $string, $matches);
          print 'I need this line: ' . $matches[1] . "\n";
          

          这会在您的字符串中搜索换行符,然后在一行中搜索一堆文本,然后是换行符,然后是“DATA ASSUNZIONE DATA”。 (.*)捕获的文本被捕获到数组元素$matches[1]中。

          这是代码运行的输出:

          I need this line: FRRVCN68S14E487E
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-11-30
            • 1970-01-01
            • 2013-04-21
            相关资源
            最近更新 更多