【问题标题】:preg_match regexp syntax extracting up to ;preg_match 正则表达式语法最多提取;
【发布时间】:2016-11-07 14:50:11
【问题描述】:

我有一个包含键/值对的文件,偶尔有注释(由';'分隔),我想用 preg_match 解析(或者 preg_match 可能是错误的工具)。

文件如下所示

  key1 VALUE1
  key2 VALUE2 ; comment 2
  key3 VALUE3a VALUE3b
  key4 VALUE4a VALUE4b ; comment 4

(每行开头有一个或多个空格)

我的 preg_match 看起来像这样 preg_match('/\s*(\S+)\s+(.+)/', $line, $result); 它正确拆分了“key1”和“key3”行。对于 key2 和 key4,“;comment #”成为 $result[2] 部分。 是否可以直接在 preg_match 中“删除”“;comment”部分(我不在乎“;comment”部分是否以 $result[3] 结尾。

【问题讨论】:

  • 您可以在您的情况下使用几个explodes。首先,获取行数组,然后用;" ; " 分解一个修剪后的字符串,然后在第一个空格处将第一个元素和explode 分成两部分。

标签: php preg-match


【解决方案1】:

你可以使用这个正则表达式:

\s*(\S+)\s+([^;]+)

see there

【讨论】:

    【解决方案2】:

    在您的情况下,您可以使用几个爆炸。首先,获取行数组,然后用;" ; " 分解一个修剪过的字符串,然后获取第一个元素并在第一个空格处分解为2 个部分。

    $str = '  key1 VALUE1
      key2 VALUE2 ; comment 2
      key3 VALUE3a VALUE3b
      key4 VALUE4a VALUE4b ; comment 4';
    $lines = explode("\n", $str);
    $res = array();
    foreach ($lines as $line) {
        $t = explode(" ; ", trim($line));
        $ch = explode(" ", $t[0], 2);
        $res[$ch[0]] =  $ch[1];
    }
    print_r($res);
    

    PHP demo

    如果你喜欢正则表达式,你可以使用

    preg_match_all('~^\h*(\w+)\h+([^;\n]+)~m', $str, $res);
    

    参见this PHP demoregex demo

    详情

    • ^ - 行首^
    • \h* - 零个或多个水平空格
    • (\w+) - 第 1 组将一个或多个单词字符捕获到第 1 组(如果可以有非单词字符,您可以使用 \S+
    • \h+- 一个或多个水平空格
    • ([^;\n]+) - 第 2 组捕获除换行符和 ; 以外的任何 1+ 个字符。

    【讨论】:

      【解决方案3】:

      试试这个,基本上你只需要预先匹配到第一个;的所有东西。

      逗号之前的所有内容都是您想要的。如果根本没有逗号,则使用整行。

      #!/usr/bin/php
      $txt = '
      key1 VALUE1\n
      key2 VALUE2 ; comment 2\n
      key3 VALUE3a VALUE3b\n
      key4 VALUE4a VALUE4b ; comment 4\n';
      
      foreach(explode('\n', $txt) as $line){
          preg_match('/(.*);.*/', $line, $group);
          if(empty($group)){
              $result = $line;//no comma found so take whole line
          }else{
              $result = $group[1];//comma found so take first matching.
          }
          echo $result."\n<br />";
      }
      

      将打印:

      key1 VALUE1
      key2 VALUE2
      key3 VALUE3a VALUE3b
      key4 VALUE4a VALUE4b
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-05
        • 2017-12-09
        • 1970-01-01
        • 2014-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多