我有这个字符串:
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 ?
答案 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"
}