php preg_match_all特殊案例所需的建议

时间:2014-05-16 17:19:05

标签: php regex preg-match-all

我有三个字符串:

72728:[390,1138,1139],12:1234,14:[12],13:12
72728:[390,1138,1139]
12:1234,14:1123

目标是将字符串拆分为(名称:值)对,而值可以是数字或列表。

到目前为止,我的正则表达式看起来像这样:

preg_match_all('/([^:]*\:[^:]*\,|\S*\:\S*$)/',$string,$matches,PREG_SET_ORDER)

对于第一个String我得到第二个字符串的正确结果我没有得到有效的结果。它削减了这样的结果:

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => 72728:[390,1138,
                    [1] => 0
                ) 
            [1] => Array
                (
                    [0] => 72728:[390,1138,
                    [1] => 0
                )  
        )   
)

为什么会这样?我准备放弃并尝试一些丑陋的其他解决方案...... 或者甚至有更好的解决方案,我使用正则表达式进行一些预处理?

2 个答案:

答案 0 :(得分:1)

这应该这样做:

(\d+):(\d+|\[[^]]+\])

工作正则表达式示例:

http://regex101.com/r/oB0aI4

PHP:

$string = '72728:[390,1138,1139],12:1234,14:[12],13:12';

preg_match_all('/(\d+):(\d+|\[[^]]+\])/',$string,$matches,PREG_PATTERN_ORDER);

var_dump($matches[0]);

输出:

array(4) {
  [0]=>
  string(21) "72728:[390,1138,1139]"
  [1]=>
  string(7) "12:1234"
  [2]=>
  string(7) "14:[12]"
  [3]=>
  string(5) "13:12"
}

答案 1 :(得分:1)

为此,您需要首先测试列表的大小写以避免逗号问题:

$pattern = '~[^\n:,]+:(?:\[[^]]+]|[^,\s]+)~';
preg_match_all($pattern, $str, $matches, PREG_SET_ORDER);
print_r($matches);

Jonathan Kuhn的方法也很有趣(取决于你之后要做的事情)。如果您的值只是整数,您可以写:

$str = '{' . strtr($str, PHP_EOL, ',' ) . '}';
$str = preg_replace('~[0-9]+~', '"$0"', $str);
$res = json_decode($str, true);
print_r($res);