2016-11-07 41 views
0

我有一个包含键/值对的文件,偶尔有评论(用';'分隔),希望用preg_match解析(或者preg_match是错误的工具)。preg_match最多提取regexp语法;

的文件看起来像这样

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直接部分(如果我不关心“意见”“意见”的一部分在$ result中结束了[3]

+0

您可以使用几个'explode's你的情况。首先,获取行数组,然后使用';'或'';''分解一个修剪过的字符串,然后在第一个空格处获取第一个元素并将其'爆炸'成两部分。 –

回答

0

您可以使用此正则表达式做到这一点:

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

see there

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+ - 一个或多个水平whitespa ces
  • ([^;\n]+) - 第2组捕获除换行符和;以外的任何1+字符。
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