我有一个包含键/值对的文件,偶尔注释(由';'分隔),想要用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]。
答案 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);
<强>详情:
^
- 行^
\h*
- 零个或多个水平空格(\w+)
- 第1组将一个或多个单词字符捕获到第1组(如果可能存在非单词字符,则可以使用\S+
)\h+
- 一个或多个水平空格([^;\n]+)
- 第2组捕获换行符以外的任何1个字符;
。答案 1 :(得分:0)
答案 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