我想使用PHP的常规表达式解析并获得二维矩阵。但我真的不知道解析器并得到一个数组(一维)。例如,我有这个字符串:
$str = {a}&{b}&{c}&{d&};
我希望转换为这样的数组:
array( 'a', 'b', 'c', 'd&' )
模式应为:
$pattern = '#(({[^}]+})(?:&(?1))*#';
模式匹配正确但我无法使用$ matches参数获取所有元素:
preg_match_all( $pattern, $str, $matches );
print_r( $matches );
输出:
Array
(
[0] => Array
(
[0] => {a}&{b}&{c}&{d&}
)
[1] => Array
(
[0] => a
)
)
我尝试用括号解决涉及递归模式的问题。
$pattern = '#(({[^}]+})(?:&((?1)))*#';
输出:
Array
(
[0] => Array
(
[0] => {a}&{b}&{c}&{d&}
)
[1] => Array
(
[0] => a
)
[2] => Array
(
[0] => d&
)
)
只获得了数组的最后一个元素。选项标志PREG_PATTERN_ORDER或con PREG_SET_ORDER没有解决我的问题。
有没有办法获得元素数组?
问候和感谢!
答案 0 :(得分:2)
呃,你的正则表达式过于复杂。
$pattern = "#{([^}]+)}#";
$data = "{a}&{b}&{c}&{d&}";
preg_match_all($pattern, $data, $matches);
print_r($matches);
输出:
Array
(
[0] => Array
(
[0] => {a}
[1] => {b}
[2] => {c}
[3] => {d&}
)
[1] => Array
(
[0] => a
[1] => b
[2] => c
[3] => d&
)
)
所以你想要的输出只是$matches[1]
。
答案 1 :(得分:1)
您可以使用此模式捕获大括号内的内容并检查语法(即{..}&{..}&{..}&{..}
):
preg_match_all('~\G{([^}]+)}(?:&|$)~', '{a}&{b}&{c}&{d&}', $result);
\G
表示“与先前匹配或字符串开头相邻”。因此,不允许间隙,并通过模式检查语法。
您要查找的数组是$result[1]
答案 2 :(得分:0)
对于您以前的问题,请尝试:
$str = "a&b&c&d&word";
$pattern = '/[^&]+/';
preg_match_all( $pattern, $str, $matches );
print_r( $matches );
得到:
Array
(
[0] => Array
(
[0] => a
[1] => b
[2] => c
[3] => d
[4] => word
)
)