作为标题,在PHP中是否有一种方法,使用preg_match_all来捕获所有重复的字符组?例如,catch
- 哈哈哈
- jajajaj
- hihihi
可以捕获任何字符的重复,如abababab, acacacacac。还有,有没有办法计算重复的次数?
这个想法是为了在社交媒体上捕捉所有这些"形式"的微笑。我发现还有其他情况,比如拼写错误的例子,比如ahahhahaah(你有两个连续的a或h)。这个怎么样:
preg_match_all('/((?i)[a-z])((?i)[a-z])('1'2)+/', $str, $m);
$matches = $m[0]; //$matches will contain an array of matches
有点复杂,但它确实有效。为了解释,第一个子模式(((?i)[a-z])
)匹配a和z之间的任何字符,无论情况如何。第二个子模式(((?i)[a-z])
)做同样的事情。第三个子模式(('1'2)+
)匹配前两个字母的一次或多次重复,在相同的情况下,它们最初被放置。这个正则表达式还假设有偶数个重复。如果您不希望这样,您可以在末尾添加'1?
,这意味着(只要它包含一个或多个重复),它可以以第一个字符结束(例如,hahah
和ikikikik
都有效,但asa
无效)。
要检索特定匹配的重复次数,您可以执行:
$numb = strlen($matches[$index])/2 - 1; //-1 because the first two letters aren't repetitions
对于最短的重复(例如ha
在hahahaha
中被重复多次):
(.+?)'1+
看演示。
对于最长的重复(例如haha
在hahahaha
中被重复):
(.+)'1+
重复计数
非正则表达式的解决方案是比较组1(重复的令牌)的长度和整体匹配。
使用纯正则表达式,在。net中,您可以简单地执行(.+?)('1)+
并查看第1组CaptureCollection对象中的捕获次数。
在PHP中,这是不可能的,但有一些hack。例如,这个关于匹配行号的问题是相同的技术。这只是为了"学习目的"——你不会想在现实生活中使用它。