使用正则表达式将字符串分解为多维

时间:2017-05-23 10:45:24

标签: php arrays regex

我有这样的字符串

$string = 'title,id,user(name,email)';

我希望结果像这样

Array
(
    [0] => title
    [1] => id
    [user] => Array
        (
            [0] => name
            [1] => email
        )

)

到目前为止,我尝试使用explode函数和多个for循环代码变得丑陋,我认为必须通过使用像preg_split之类的正则表达式来获得更好的解决方案。

2 个答案:

答案 0 :(得分:1)

将逗号替换为嵌套数据集的###,然后用逗号进行爆炸。然后对数组进行迭代,将嵌套数据集拆分为数组。示例:

$string = 'user(name,email),office(title),title,id';

$string = preg_replace_callback("|\(([a-z,]+)\)|i", function($s) {
    return str_replace(",", "###", $s[0]);
}, $string);

$data = explode(',', $string);

$data = array_reduce($data, function($old, $new) {
    preg_match('/(.+)\((.+)\)/', $new, $m);

    if(isset($m[1], $m[2]))
    {
        return $old + [$m[1] => explode('###', $m[2])];
    }

    return array_merge($old , [$new]);
}, []);


print '<pre>';
print_r($data);

答案 1 :(得分:0)

首先要感谢@janie给我启发,我已经忙碌了一段时间,从昨天起我已经学会了一些正则表达式并尝试根据我的需要修改@janie回答套件,这是我的代码。

$string = 'user(name,email),title,id,office(title),user(name,email),title';

$commaBetweenParentheses = "|,(?=[^\(]*\))|";
$string = preg_replace($commaBetweenParentheses, '###', $string);
$array = explode(',', $string);

$stringFollowedByParentheses = '|(.+)\((.+)\)|';
$final = array();
foreach ($array as $value) {

    preg_match($stringFollowedByParentheses, $value, $result);

    if(!empty($result))
    {
        $final[$result[1]] = explode('###', $result[2]);
    }
    if(empty($result) && !in_array($value, $final)){
        $final[] = $value;
    }
}
echo "<pre>";
print_r($final);