使用星号*量词的奇怪结果

时间:2019-01-29 10:55:01

标签: php regex pcre

我试图在一个简单的字符串上练习星号*量词,但是当我只有两个字母时,结果包含第三个匹配项。

<?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) ""
    }
 }

那第三场比赛是什么?

2 个答案:

答案 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 继续查找,直到完成处理整个字符串为止。找到匹配项后,它将保留字符串的其余部分以尝试应用其他匹配项。