PHP Regexp捕获重复的一组字符,例如hahaha jajajaja hihihi


PHP Regexp capturing repeating group of chars, e.g. hahaha jajajaja hihihi

作为标题,在PHP中是否有一种方法,使用preg_match_all来捕获所有重复的字符组?例如,catch

  1. 哈哈哈
  2. jajajaj
  3. 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?,这意味着(只要它包含一个或多个重复),它可以以第一个字符结束(例如,hahahikikikik都有效,但asa无效)。

要检索特定匹配的重复次数,您可以执行:

$numb = strlen($matches[$index])/2 - 1; //-1 because the first two letters aren't repetitions

对于最短的重复(例如hahahahaha中被重复多次):

(.+?)'1+

看演示。

对于最长的重复(例如hahahahahaha中被重复):

(.+)'1+

重复计数

非正则表达式的解决方案是比较组1(重复的令牌)的长度和整体匹配。

使用纯正则表达式,在。net中,您可以简单地执行(.+?)('1)+并查看第1组CaptureCollection对象中的捕获次数。

在PHP中,这是不可能的,但有一些hack。例如,这个关于匹配行号的问题是相同的技术。这只是为了"学习目的"——你不会想在现实生活中使用它。