我有一个preg_match问题。 这是字符串
field[0][price][8]
正则表达式
"/([\[]([a-zA-Z0-9\_]+)?[\]])+$/"
我想检查字符串是否以一个或多个[]结束并提取其中的所有值。
当我放置$
标记时,preg_match_all
仅获取最大和最后找到的组。 preg_match
会发生类似的事情。
输出:
array (size=3)
0 =>
array (size=1)
0 => string '[0][price][8]' (length=13)
1 =>
array (size=1)
0 => string '[8]' (length=3)
2 =>
array (size=1)
0 => string '8' (length=1)
这是我想要的结果,只有当我省略$
标志时才会得到,这是不行的,因为我需要检查字符串是否以匹配的模式结束:
array (size=3)
0 =>
array (size=3)
0 => string '[0]' (length=3)
1 => string '[price]' (length=7)
2 => string '[8]' (length=3)
1 =>
array (size=3)
0 => string '[0]' (length=3)
1 => string '[price]' (length=7)
2 => string '[8]' (length=3)
2 =>
array (size=3)
0 => string '0' (length=1)
1 => string 'price' (length=5)
2 => string '8' (length=1)
有什么想法吗?非常感谢!
答案 0 :(得分:3)
您可以使用正向前瞻来检查字符串是否以所需格式结束:
preg_match_all("/(?=.*(?:\[.*?])+$)\[(.*?)]/", $str, $matches);
$result = $matches[1];
(?:\[.*?])+
与一个或多个[xyz]
部分匹配。仅当前瞻成功时才执行实际匹配。
对于相关字符串,$result
将包含:
array(3) {
[0]=>
string(1) "0"
[1]=>
string(5) "price"
[2]=>
string(1) "8"
}
答案 1 :(得分:0)
使用strrev
的其他方式:
$str = 'field[0][price][8]';
if (preg_match_all('~\G]([^[]*)\[~', strrev($str), $m))
$result = array_map('strrev', $m[1]);
print_r($result);
答案 2 :(得分:0)
如果您不喜欢写$match[0][$something[0]
,则可以使用T-Regx library:
pattern("([\[]([a-zA-Z0-9\_]+)?[\]])+$")
->match('field[0][price][8]')
->first(function (Match $match) {
$match->text(); // the matched occurrence
$match->group(1); // group #1 of the match
});