php preg_match字符串末尾的多个组

时间:2014-08-07 19:49:13

标签: php regex match

我有一个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)

有什么想法吗?非常感谢!

3 个答案:

答案 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
    });