如何通过PHP中的重复字符拆分字符串?

Raf*_*Dev 6 php string binary

我正在尝试将带有二进制的字符串拆分为重复字符数组。

例如,10001101具有此函数的split数组将是:

    $arr[0] = '1';
    $arr[1] = '000';
    $arr[2] = '11';
    $arr[3] = '0';
    $arr[4] = '1';
Run Code Online (Sandbox Code Playgroud)

(我试图让自己清楚,但如果你仍然不明白,我的问题与这个相同,但对于 PHP,而不是 Python)

use*_*918 5

你可以preg_split像这样使用:

例子:

$in = "10001101";
$out = preg_split('/(.)(?!\1|$)\K/', $in);

print_r($out);
Run Code Online (Sandbox Code Playgroud)

输出:

Array
(
    [0] => 1
    [1] => 000
    [2] => 11
    [3] => 0
    [4] => 1
)
Run Code Online (Sandbox Code Playgroud)

正则表达式:

  • (.) - 匹配单个字符并捕获它
  • (?!\1|$) - 查看下一个位置并匹配是否与我们刚刚找到的位置或字符串末尾不同。
  • \K - 使匹配的文本远离整个正则表达式匹配,使该匹配为零宽度。

注意:这在 5.6.13 之前的 PHP 版本中不起作用,因为存在一个涉及与 \K 的碰撞行为错误


在早期版本中也适用的替代正则表达式是:

$out = preg_split('/(?<=(.))(?!\1|$)/', $in);
Run Code Online (Sandbox Code Playgroud)

这使用后视而不是\K为了使匹配零宽度。


sti*_*ksu 0

我在想这样的事情。代码id没有测试过,是我直接写在注释里的,所以可能会有一些错误,大家可以调整一下。

$chunks = array();
$index = 0;
$chunks[$index] = $arr[0];
for($i = 1; $i < sizeof($arr) - 1; $i++) {
  if( $arr[$i] == $arr[$i-1] ) {
    $chunks[$index] .= $arr[$i];
  } else {
    $index++;
    $chunks[$index] = $arr[$i];
  }
}
Run Code Online (Sandbox Code Playgroud)