PHP: preg_match_all() - 划分一个数组

PHP: preg_match_all() - divide an array

我有以下代码:

$str = '{"ok1", "ok2"}, 
        {"ok3", "ok4"}, 
        {"ok5", "ok6"}';

preg_match_all('/"([^"]*)"/', $str, $matches);

print_r($matches[1]);

输出如下: Array ( [0] => ok1 [1] => ok2 [2] => ok3 [3] => ok4 [4] => ok5 [5] => ok6 )

效果很好,但我想将其设为 array1、array2 和 array3。所以它将根据 {}

内的标签划分数组

 `array1` will be  `array("ok1", "ok2")`;
 `array2` will be  `array("ok3", "ok4")`; 
 `array3` will be  `array("ok5", "ok6")`; 

有点矫枉过正,但您 确实 也可以使用两个正则表达式实现它(如果这不是某些 JSON 代码):

<?php 
$string = '{"ok1", "ok2"}, {"ok3", "ok4"}, {"ok5", "ok6"}';
$regex = '~(?<=}),\s~';
$result = array();
$parts = preg_split($regex, $string);
foreach ($parts as $part) {
    preg_match_all('~"(?<values>[^"]+)"~', $part, $elements);
    $result[] = $elements["values"];
}
echo $result[0][1]; // ok2
?>

Jan 的回答非常好,我在这里发布我的回答只是作为使用正则表达式解决问题的另一种方式 - 并不是要剥夺他的回答。

如果你有这样的字符串:

$output_array = array();
$str = '{"ok1", "ok2", "ok9", "ok11"}, 
        {"ok3", "ok4"}, 
        {"ok5", "ok6", "ok99"}';

然后您可以查找所有花括号组并将它们存储到一个数组中:

preg_match_all('~\{.*?\}~', $str, $matches);

最后,循环遍历每组大括号,匹配每组出现在引号中的数据。然后将这些匹配添加到您的输出数组。

foreach ($matches[0] AS $set) {
    preg_match_all('~".*?"~', $set, $set_matches);
    $output_array[] = $set_matches[0];
}

print_r($output_array);

这会给你一个像这样的数组:

Array
(
    [0] => Array
        (
            [0] => "ok1"
            [1] => "ok2"
            [2] => "ok9"
            [3] => "ok11"
        )

    [1] => Array
        (
            [0] => "ok3"
            [1] => "ok4"
        )

    [2] => Array
        (
            [0] => "ok5"
            [1] => "ok6"
            [2] => "ok99"
        )

)