2014-10-04 84 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来查看一个工作示例。


希望它有用!