a* 表示零个或多个 a。
在字符串 'abbabba' 中,出现了两次 abba。(abba)bba 和 abb(abba)。preg_match_all 只匹配第一次出现。
我是否缺少任何基本的正则表达式基础?
$string = 'abbabba';
preg_match_all("/ab*a/", $string, $matches);
print_r($matches);
Array ( [0] => Array ( [0] => abba ) )
搜索主题以查找与模式中给定的正则表达式的所有匹配项,并按照标志指定的顺序将它们放入匹配项中。
找到第一个匹配后,从最后一个匹配的末尾继续进行后续搜索。
因为ab*a
消耗文本。这意味着解析器匹配第一次出现abba
并从 重新开始bba
,与您的模式不匹配。
解决方案:将前瞻断言与捕获组一起使用:
preg_match_all('/(?=(ab*a))/', $subject, $result, PREG_PATTERN_ORDER);
$result = $result[1];
*
表示贪婪搜索。当引擎看到b*
它将一直匹配到字符串的末尾并向后移动直到到达 ab
时,它将检查匹配到该点的字符串是否与您的模式匹配。
首先,它看起来与 匹配a
,它马上就完成了。然后它看到b*
它一直匹配字符串,直到b
第一个 a 之后的字符串中最后一次出现 (因为*
表示 b 应该匹配“贪婪”),abb
此时基本上匹配。然后它看到它需要匹配另一个a
才能成功匹配,所以它抓取下一个字符,即 an a
,然后完成,留下bba
剩余的,这与您的模式不匹配。希望这可以帮助。
如果你按照欧米茄所说的去做,你将获得史诗般的胜利。
要查找出现次数,请使用:
preg_match_all('/(?=ab*a)/', $input, $result);
print(count($result[0]));
要查找匹配项,请使用:
preg_match_all('/(?=(ab*a))/', $input, $result);
print_r($result[1]);