我有三个字符串:
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
)
)
)
为什么会这样?我准备放弃并尝试一些丑陋的其他解决方案...... 或者甚至有更好的解决方案,我使用正则表达式进行一些预处理?
答案 0 :(得分:1)
这应该这样做:
(\d+):(\d+|\[[^]]+\])
工作正则表达式示例:
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);