php preg_match_特殊情况所需的所有建议

php preg_match_特殊情况所需的所有建议,php,regex,preg-match-all,Php,Regex,Preg Match All,我有三条线: 72728:[390,1138,1139],12:1234,14:[12],13:12 72728:[390,1138,1139] 12:1234,14:1123 目标是将字符串拆分为成对的(名称:value),而value可以是数字或列表 到目前为止,我的正则表达式如下所示: preg_match_all('/([^:]*\:[^:]*\,|\S*\:\S*$)/',$string,$matches,PREG_SET_ORDER) 对于第一个字符串,我得到了正确的结果;对于第

我有三条线:

72728:[390,1138,1139],12:1234,14:[12],13:12
72728:[390,1138,1139]
12:1234,14:1123
目标是将字符串拆分为成对的(名称:value),而value可以是数字或列表

到目前为止,我的正则表达式如下所示:

preg_match_all('/([^:]*\:[^:]*\,|\S*\:\S*$)/',$string,$matches,PREG_SET_ORDER)
对于第一个字符串,我得到了正确的结果;对于第二个字符串,我没有得到有效的结果。它切割的结果如下所示:

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => 72728:[390,1138,
                    [1] => 0
                ) 
            [1] => Array
                (
                    [0] => 72728:[390,1138,
                    [1] => 0
                )  
        )   
)
为什么会这样?我准备放弃,尝试一些丑陋的其他解决方案。。。 或者有更好的解决方案使用正则表达式进行一些预处理吗?

这应该可以做到:

(\d+):(\d+|\[[^]]+\])
工作正则表达式示例:

PHP:

输出:

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

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

$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);

这几乎就是json。你可以用大括号括起来,然后对每一行进行解码。@JonathanKuhn你确定吗?像这样:
print\u r(json\u decode(“{.$string.”),true)-因为这不起作用…您需要单独处理每一行,或者用逗号替换换行符。当我进行测试时,json_decode失败,原因很简单,因为json_decode要求密钥用双引号括起来,否则格式不正确。也许一个不同的json解析器可以工作,或者它可以被重新格式化。我没有否决你的问题,但我认为尝试用正则表达式解析上下文无关的语言是一个糟糕的主意,这可能会导致有人否决你的问题。至于你的其他评论,即使你不“控制”输入,你也可以对其进行预处理(在键周围添加引号等),然后使用JSON解析器。这两种方法都很好,效果也很好。鉴于对我问题的评论,我推荐第二种解决方案!
$str = '{' . strtr($str, PHP_EOL, ',' ) . '}';
$str = preg_replace('~[0-9]+~', '"$0"', $str);
$res = json_decode($str, true);
print_r($res);