preg匹配错误的结果

时间:2014-03-12 13:26:56

标签: php regex preg-match

我有这个字符串:

a[0]=a[27%a.length];

和这种模式

([a-z])+\[(\S)+\]\=([a-z])+\[+(.*?)+\%+([a-z])+\.length

Preg match array就是这个:

array(6) {
  [0]=>
  string(18) "a[0]=a[27%a.length"
  [1]=>
  string(1) "a"
  [2]=>
  string(1) "0"
  [3]=>
  string(1) "a"
  [4]=>
  string(0) ""
  [5]=>
  string(1) "a"
}

为什么元素4为空而不是持有 27

2 个答案:

答案 0 :(得分:0)

我认为有一个“+”太多了。这个正则表达式看起来像你期望的那样工作:

([a-z])+\[(\S)+\]\=([a-z])+\[+(.*?)\%+([a-z])+\.length

以下内容更清晰,它与输入字符串匹配:

([a-z])+\[(\S)+\]\=([a-z])+\[(.*?)\%([a-z])+\.length

不同之处在于我在方括号后删除了不必要的“+”(“+”表示“一个或多个”,而每个位置应该只有一个括号)。

有关解释,请参阅regex101,它对表达式的各个部分有一个很好的格式:http://regex101.com/r/iB6nH1

答案 1 :(得分:0)

因为你使用了(.*?)+,所以匹配的部分将被末尾的空字符串替换。

删除+,然后您将在匹配部分获得27

php > preg_match('/([a-z])+\[(\S)+\]\=([a-z])+\[+(.*?)\%+([a-z])+\.length/', $str, $matches);
php > var_dump($matches);
array(6) {
  [0]=>
  string(18) "a[0]=a[27%a.length"
  [1]=>
  string(1) "a"
  [2]=>
  string(1) "0"
  [3]=>
  string(1) "a"
  [4]=>
  string(2) "27"
  [5]=>
  string(1) "a"
}