PHP preg_split,由相同的字符分隔

时间:2014-10-04 12:04:24

标签: php regex preg-split

我试图用preg_split分割字符串。这是字符串的一个示例: 111235622411 我希望输出像这样:

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

因此,如果一个接一个地使用相同的字符,我希望它们在同一个" chunk"中。我无法想出我应该使用的正则表达式。如果有些条款错误,我很抱歉,因为我以前用PHP编码已经有一段时间了。

3 个答案:

答案 0 :(得分: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"
}

答案 1 :(得分:1)

您可以使用此正则表达式:

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

而不是拆分它,参加比赛。

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

$matches[0]将包含您想要的内容。正如@ hek2mgl建议的那样,您也可以使用更简单的/(\d)\1*/

DEMO

答案 2 :(得分:0)

以下是一个简单的解决方案,包括执行preg_match_all:

这种情况下的正则表达式是:

(\d)\1*

正则表达式的含义:

  • (\ d):第一个捕获组。 \ d匹配一个数字[0-9]。
  • \ 1匹配与第一个捕获组最近匹配的文本相同的文本。
  • *:零和无限次之间的量词。

php代码将是:

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

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

您可以访问第一个匹配组,即" 111"像这样:$ matches [0] [0],第二个是" 2"喜欢这个$匹配[0] [1],依此类推。点击此处Demo查看一个有效的示例。


希望它有用!