使用preg_match_all中的php对/数组创建多维递归正则表达式

时间:2015-03-01 22:27:04

标签: php arrays regex multidimensional-array

我有以下字符串,我需要打包以提取参数,以便处理代码的下一部分。我已经设法通过执行多个preg_match_all来做到这一点,但它不是非常有效和/或动态。

示例字符串(源可能包含多个): < == OBJECTSTART ==>类型=> SQLTABLE,OBJECTID => 4000001,选项=大于1 | 5 | 2'; == OBJECTEND ==>

< == OBJECTSTART ==>类型=> SQLTABLE,OBJECTID => 4000002,选项=→3 | 8 | 5℃; == OBJECTEND ==>

到目前为止,我已经使用了以下正则表达式:

/< == OBJECTSTART ==>((),?)&LT(?); == OBJECTEND ==> /

这给了我第一个逗号之前的信息,但我尝试了通常的+和*给我一个重复的迭代但没有运气。

理想情况下,我正在寻找一个类似于以下

的对象数组

[0] =>

[type]=sqltable
[objected]=4000001
[options]=1|5|2

[1] =>

[type]=sqltable
[objected]=4000002
[options]=3|8|5

提前感谢!

2 个答案:

答案 0 :(得分:1)

这可能不是最优雅的解析方法,但我认为它完成了工作:

$str = <<<EOS
<==OBJECTSTART==>type=>sqltable,objectid=>4000001,options=>1|5|2<==OBJECTEND==>
<==OBJECTSTART==>type=>sqltable,objectid=>4000002,options=>3|8|5<==OBJECTEND==>
EOS;

foreach (explode(PHP_EOL, $str) as $line) {
    $line = preg_replace('/<==OBJECTSTART==>(.*)<==OBJECTEND==>/', '\1', $line);
    $pairs = explode(',', $line);

    $data = array();
    foreach ($pairs as $pair) {
        list ($key, $value) = explode('=>', $pair);
        $data[$key] = $value;
    }
    $result[] = $data;
}
print_r($result);

输出:

Array
(
    [0] => Array
        (
            [type] => sqltable
            [objectid] => 4000001
            [options] => 1|5|2
        )

    [1] => Array
        (
            [type] => sqltable
            [objectid] => 4000002
            [options] => 3|8|5
        )

)

答案 1 :(得分:1)

&lt; == OBJECTSTART ==&gt; &lt; == OBJECTEND ==&gt;

之间的第一次提取
  $str= substr($str, strlen("<==OBJECTSTART==>"), -1 * strlen("<==OBJECTEND==>"));

然后获取所有对属性/值

  preg_match_all("#([^\=]*)\=>([^\,<]*)#",str,values);

最后,组合数组中的键和值

  $result= array_combine( $values[1], $values[2] );