使用preg_match_all统计特定单词出现后另一指定单词的出现次数
正确匹配规则
使用如下正则即可匹配到world之后出现的所有hello:
/(?:world|\G(?!^)).*?\Khello/s
规则说明
- 末尾的
s是正则修饰符,作用是让通配符.可以匹配换行符,适配多行文本场景 (?:world|\G(?!^))为非捕获组,匹配两种合法起始位置:- 首次匹配从文本中出现
world的位置开始 - 后续匹配从上一次匹配成功的结束位置开始,
\G(?!^)排除了文本起始位置,避免匹配到world之前的hello
- 首次匹配从文本中出现
.*?是非贪婪匹配,匹配任意长度的任意字符,直到遇到下一个hello\K的作用是重置匹配结果,丢弃前面匹配到的所有内容,最终只将hello计入匹配结果列表
调用示例
$text = 'blah blah blah hello blah blah blah class="world" blah blah blah hello blah blah hello blah blah blah hello blah blah blah'; preg_match_all('/(?:world|\G(?!^)).*?\Khello/s', $text, $matches); $resultCount = count($matches[0]); // $resultCount 的值为预期的3
原有写法问题说明
world.+(hello)使用贪婪匹配,.+会一直匹配到文本末尾,再回退查找最后一个hello,因此只能得到1个匹配结果world.*?(hello)使用非贪婪匹配,单次匹配找到第一个hello就停止,全局匹配时每次都从world的起始位置重新查找,因此也只能得到1个匹配结果
内容的提问来源于stack exchange,提问作者limestreetlab
相关产品推荐
相关产品推荐

