preg_match regexp语法提取最多;

时间:2016-11-07 14:50:11

标签: php preg-match

我有一个包含键/值对的文件,偶尔注释(由';'分隔),想要用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”部分是否以$ result结尾[3]。

3 个答案:

答案 0 :(得分:0)

在您的情况下,您可能会使用一些爆炸。首先,获取行数组,然后使用;" ; "分割修剪后的字符串,然后获取第一个元素并在第一个空格处分成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个字符;

答案 1 :(得分:0)

您可以使用此正则表达式执行此操作:

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

see there

答案 2 :(得分:0)

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

逗号之前的一切都是你想要的。如果根本没有逗号,你可以全线。

#!/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