我得到了以下情况:非贪婪通配符“忽略”
...
preg_match('/#(.+?):(.+?)#/im','partA#partB#partC:partD#partE#partF',$matches);
...
执行$比赛后成为
Array
(
[0] => #partB#partC:partD#
[1] => partB#partC
[2] => partD
)
岂不是正常的$matches[1]
成为partC
如果我使用非贪婪通配符?
?我错过了什么吗?
我设法通过使用'/#([^#]+?):([^#]+?)#/im'
作为模式来解决这个问题,但一个相关的解释对于清除云是很好的。
感谢。
实际上,你可以使用''/#([^#:] +)([^#] +)#/“'。重点是* lazy *量词不保证最短匹配,并且正则表达式引擎(默认)从左到右处理字符串。一旦找到有效的符号,就会从最左边的位置到右边尝试其余的模式。所以,'partB#partC'对'。+?'可以。 –
要理解,正则表达式引擎从左到右搜索字符串,并尝试在字符串中的每个位置成功。 –
我在你的正则表达式'#'中看到':'到'#'。与'abc'匹配############################################# ################################:#'def'。你看到的是'#:#'。原因在于你想看到的是人性。 – sln