2014-07-14 48 views
0

作爲標題,是否有一種方法在PHP中,用preg_match_all來捕獲所有重複的字符組? 對於instante抓PHP Regexp捕獲重複的字符組,例如hahaha jajajaja hihihi

  1. 哈哈哈哈
  2. jajajaj
  3. hihihi

它的優良捕捉任何字符的重複,像ABABABAB,acacacacac。 另外,有沒有一種方法來計算重複次數?

這個想法是捕捉所有這些在社交媒體上微笑的「形式」。 我發現還有其他的情況,比如拼寫錯誤的例子,如ahahhahaah(你有兩個連續的a或h)。有任何想法嗎?

+0

我會以'/(??){2,} /'開頭,然後在PHP中做進一步的處理。也就是說,完全可以在正則表達式中完成它(也就是檢查模式中的兩個字符是不一樣的)。 – halfer

+0

我不完全明白你需要什麼。你可以用你想要的組編寫一個正則表達式並計算匹配。在這裏檢查http://regex101.com/r/tS9eP6/1這個例子''你有4場比賽 –

+0

你想要的輸出是什麼? – hwnd

回答

2

如何:

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 
1

對於最短的重複(如ha獲取hahahaha多次重複):

(.+?)\1+ 

demo

對於最長的重複(例如haha獲取hahahaha重複):

(.+)\1+ 

計數重複次數

的非正則表達式的解決方案是比較組1(repteated令牌)的長度和整體比賽。

使用純正則表達式,在.NET中,您可以簡單地執行(.+?)(\1)+並查看Group 1 CaptureCollection對象中的捕獲次數。

在PHP中,這是不可能的,但有一些黑客。例如,看這個關於matching a line number的問題 - 這是同樣的技術。這只是爲了「研究目的」 - 你不想在現實生活中使用它。

+0

這是一個非常好的技術。一如既往,很高興向您學習 –

+0

@Fede感謝您的好消息,感到非常高興。 :) – zx81

+0

一般重複的好技術,只要你記住它也匹配'asdfasdf'和'hellohello',而不僅僅是字符重複。 – Max