我正在尝试构建一个与两个更大(或相等)或更小(或相等)符号之间的数学表达式匹配的函数。
我有以下preg_match函数:
preg_match("/(<=?|>=?)(([0-9]|\+|\(|\))+)(<=?|>=?)/", "2<(2+2)<8", $matches);
当我读到$ matches数组时,我得到:
Array
(
[0] => <(2+2)<
[1] => <
[2] => (2+2)
[3] => )
[4] => <
)
任何人都可以解释为什么结束)作为(2 + 2)及其自身的一部分进行匹配?我希望它只匹配整个(2 + 2)。
答案 0 :(得分:1)
因为您在比较符号之间有两个捕获组:
(<=?|>=?)(([0-9]|\+|\(|\))+)(<=?|>=?)
^^ ^ ^
|`----- $3 -----' |
`------- $2 ------'
将其更改为
(<=?|>=?)((?:[0-9]|\+|\(|\))+)(<=?|>=?)
^^
答案 1 :(得分:0)
因为您有一个量化的捕获组(...)+
每次通过捕获组,将捕获组重置为空 结果是你只看到最后一次捕获。
您可以在下面看到3 start/end
。
( <=? | >=? ) # (1)
( # (2 start)
( # (3 start)
[0-9]
| \+
| \(
| \)
)+ # (3 end)
) # (2 end)
( <=? | >=? ) # (4)
在这种情况下,各个部件都没用,
将其更改为群集组将从输出数组中将其排除。
( <=? | >=? ) # (1)
( # (2 start)
(?:
[0-9]
| \+
| \(
| \)
)+
) # (2 end)
( <=? | >=? ) # (3)
输出
** Grp 0 - ( pos 0 , len 7 )
<(2+2)<
** Grp 1 - ( pos 0 , len 1 )
<
** Grp 2 - ( pos 1 , len 5 )
(2+2)
** Grp 3 - ( pos 6 , len 1 )
<