2014-10-04 36 views
1

我試圖用preg_split拆分字符串。下面是字符串的例子: 111235622411 我所要的輸出是這樣的:PHP preg_split,由相同的字符拆分

$arr[0] = "111"; 
$arr[1] = "2"; 
$arr[2] = "3"; 
$arr[3] = "5"; 
$arr[4] = "6"; 
$arr[5] = "22"; 
$arr[6] = "4"; 
$arr[7] = "11"; 

所以,如果有相同的字符,一前一後,我希望他們在同一個「塊」。我不能拿出我應該使用的正則表達式。如果有些術語是錯誤的,我很遺憾,因爲我之前編寫過PHP已經有一段時間了。

回答

1

你可以使用這個表達式:

(.)(?=\1)\1+|\d 

,而是分裂它,拿火柴。

$matches = null; 
$returnValue = preg_match_all('/(.)(?=\\1)\\1+|\\d/', '111235622411', $matches); 

$matches[0]將包含你想要的。正如@ hek2mgl曾建議,您也可以使用簡單的/(\d)\1*/

DEMO

3

我會用preg_match_all()

$string = '111235622411'; 

preg_match_all('/(.)\1*/', $string, $matches); 
var_dump($matches[0]); 

\1引用先前捕獲組(.)(任何單個字符)。該功能稱爲back referencing。正則表達式重複以前匹配的字符 - 貪婪*這意味着它匹配儘可能多的相等字符,在問題中需要什麼。

輸出:

array(8) { 
    [0]=> 
    string(3) "111" 
    [1]=> 
    string(1) "2" 
    [2]=> 
    string(1) "3" 
    [3]=> 
    string(1) "5" 
    [4]=> 
    string(1) "6" 
    [5]=> 
    string(2) "22" 
    [6]=> 
    string(1) "4" 
    [7]=> 
    string(2) "11" 
} 
0

之後,一個簡單的解決方案,其由在執行preg_match_all:

在這種情況下,正則表達式是:正則表達式的

(\d)\1* 

意義:

(\ d):
  • (\ d):第一捕獲組。 \ d匹配一個數字[0-9]。
  • \ 1匹配與第1個捕獲組最近匹配的文本相同的文本。
  • *:零和無限次之間的量詞。

PHP代碼將是:

$re = "/(\\d)\\1*/"; 
$str = "111235622411"; 

preg_match_all($re, $str, $matches); 
print_r($matches[0]); 

可以例如訪問第一匹配組,這是 「111」 是這樣的:$比賽[0] [0],第二個是「 2「就像這個$匹配[0] [1],依此類推。點擊這裏查看Demo來查看一個工作示例。


希望它有用!