我试图在一个简单的字符串上练习星号*量词,但是当我只有两个字母时,结果包含第三个匹配项。
<?php
$x = 'ab';
preg_match_all("/a*/",$x,$m);
echo '<pre>';
var_dump($m);
echo '</pre>';
?>
结果出来了
array(1) {
[0]=>
array(3) {
[0]=> string(1) "a"
[1]=> string(0) ""
[2]=> string(0) ""
}
}
据我了解,它首先与a匹配,然后在b时没有匹配,所以结果应该是
array(1) {
[0]=>
array(2) {
[0]=> string(1) "a"
[1]=> string(0) ""
}
}
那第三场比赛是什么?
答案 0 :(得分:2)
通过使用正则表达式演示工具here,我们可以看到第一个匹配项是a
,而第二个和第三个匹配项是a
和{{之间的零宽度定界符1}},也位于b
和字符串结尾之间。
请记住,b
的行为是重复采用模式preg_match_all
,并尝试将其顺序地应用于整个输入字符串。
我怀疑您真正想在这里使用的是a*
。如果您对此second demo进行检查,您会发现a+
中的单个a+
字母与a
仅匹配一次。因此,我投票赞成在此处使用ab
解决您的问题。
答案 1 :(得分:0)
您的正则表达式'/ a / *'匹配零(空)或更多个连续的a
字符。
示例:如果您尝试将'/ a * /'匹配为空字符串,则它将返回一个匹配项,因为*指的是空无一物。 see here
preg_match_all 继续查找,直到完成处理整个字符串为止。找到匹配项后,它将保留字符串的其余部分以尝试应用其他匹配项。