我有以下字符串,我需要打包以提取参数,以便处理代码的下一部分。我已经设法通过执行多个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
提前感谢!
答案 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] );