I have this string:
a[0]=a[27%a.length];
and this pattern
([a-z])+\[(\S)+\]\=([a-z])+\[+(.*?)+\%+([a-z])+\.length
Preg match array is this one:
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"
}
Why is the element 4 empty instead of holding the 27?
I think there's one "+" too many. This regex seems to work as you would expect:
([a-z])+\[(\S)+\]\=([a-z])+\[+(.*?)\%+([a-z])+\.length
The following is even cleaner, and it matches the input string:
([a-z])+\[(\S)+\]\=([a-z])+\[(.*?)\%([a-z])+\.length
The difference is that I removed the unnecessary "+" after the squared brackets ("+" means "one or more", while there should be only one bracket in each position).
For an explanation, please refer to regex101, which has a nice formatting for the various parts of the expression: http://regex101.com/r/iB6nH1
Because you used (.*?)+
, the matched part will be replaced by empty string at end.
Remove that +
then you will get 27
in the match part.
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"
}