在每三个字符实例之后分割一个字符串

问题描述 投票:0回答:10

如何在每三个分号(;)之后的位置分解字符串?

示例数据:

$string = 'piece1;piece2;piece3;piece4;piece5;piece6;piece7;piece8;';

所需输出:

$output[0] = 'piece1;piece2:piece3;'

$output[1] = 'piece4;piece5;piece6;'

$output[2] = 'piece7;piece8;'

请注意,保留尾随分号。

php arrays split preg-split delimited
10个回答
8
投票

我相信你可以用正则表达式做一些巧妙的事情,但为什么不直接分解每个半色,然后一次添加三个。

$tmp = explode(";", $string);
$i=0;
$j=0;

foreach($tmp as $piece) {
   if(! ($i++ %3)) $j++;   //increment every 3 
   $result[$j] .= $piece;
}

6
投票

我能想到的最简单的解决方案是:

$chunks = array_chunk(explode(';', $input), 3);
$output = array_map(create_function('$a', 'return implode(";",$a);'), $chunks);

3
投票

与其他解决方案基本相同,

explode
并再次加入...

$tmp = explode(";", $string);

while ($tmp) {
    $output[] = implode(';', array_splice($tmp, 0, 3));
};

1
投票
$string = "piece1;piece2;piece3;piece4;piece5;piece6;piece7;piece8;piece9;";
preg_match_all('/([A-Za-z0-9\.]*;[A-Za-z0-9\.]*;[A-Za-z0-9\.]*;)/',$string,$matches);

print_r($matches);

Array
(
    [0] => Array
        (
            [0] => piece1;piece2;piece3;
            [1] => piece4;piece5;piece6;
            [2] => piece7;piece8;piece9;
        )

    [1] => Array
        (
            [0] => piece1;piece2;piece3;
            [1] => piece4;piece5;piece6;
            [2] => piece7;piece8;piece9;
        )

)

1
投票

也许从不同的角度来看待它。将其全部分解,然后将其重新组合成三元组。就像这样...

$str = "1;2;3;4;5;6;7;8;9";
$boobies = explode(";", $array);
while (!empty($boobies))
{
  $foo = array();
  $foo[] = array_shift($boobies);
  $foo[] = array_shift($boobies);
  $foo[] = array_shift($boobies);
  $bar[] = implode(";", $foo) . ";";
}

print_r($bar);

数组 ( [0] => 1;2;3; [1] => 4;5;6; [2] => 7;8;9; )


1
投票

这是一个正则表达式方法,我不能说它太好看了。

$str='';
for ($i=1; $i<20; $i++) {
    $str .= "$i;";
}

$split = preg_split('/((?:[^;]*;){3})/', $str, -1,
                    PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

输出:

Array
(
    [0] => 1;2;3;
    [1] => 4;5;6;
    [2] => 7;8;9;
    [3] => 10;11;12;
    [4] => 13;14;15;
    [5] => 16;17;18;
    [6] => 19;
)

1
投票

另一种正则表达式方法。

<?php
$string = 'piece1;piece2;piece3;piece4;piece5;piece6;piece7;piece8';
preg_match_all('/([^;]+;?){1,3}/', $string, $m, PREG_SET_ORDER);
print_r($m);

结果:

Array
(
    [0] => Array
        (
            [0] => piece1;piece2;piece3;
            [1] => piece3;
        )

    [1] => Array
        (
            [0] => piece4;piece5;piece6;
            [1] => piece6;
        )

    [2] => Array
        (
            [0] => piece7;piece8
            [1] => piece8
        )

)

0
投票

正则表达式分割

$test = ";2;3;4;5;6;7;8;9;10;;12;;14;15;16;17;18;19;20";
// match all groups that:
// (?<=^|;) follow the beginning of the string or a ;
// [^;]*  have zero or more non ; characters
// ;? maybe a semi-colon (so we catch a single group)
// [^;]*;? again (catch second item)
// [^;]* without the trailing ; (to not capture the final ;)
preg_match_all("/(?<=^|;)[^;]*;?[^;]*;?[^;]*/", $test, $matches);
var_dump($matches[0]);


array(7) {
  [0]=>
  string(4) ";2;3"
  [1]=>
  string(5) "4;5;6"
  [2]=>
  string(5) "7;8;9"
  [3]=>
  string(6) "10;;12"
  [4]=>
  string(6) ";14;15"
  [5]=>
  string(8) "16;17;18"
  [6]=>
  string(5) "19;20"
}

0
投票
<?php
$str = 'piece1;piece2;piece3;piece4;piece5;piece6;piece7;piece8;';
$arr = array_map(function ($arr) {
    return implode(";", $arr);
}, array_chunk(explode(";", $str), 3));
var_dump($arr);

输出

 array(3) {
  [0]=>
  string(20) "piece1;piece2;piece3"
  [1]=>
  string(20) "piece4;piece5;piece6"
  [2]=>
  string(14) "piece7;piece8;"
}

0
投票

与@Sebastian 之前的回答类似,我推荐使用重复模式的

preg_split()
。不同之处在于,通过使用非捕获组并附加
\K
来重新启动全字符串匹配,您可以省去编写
PREG_SPLIT_DELIM_CAPTURE
标志。

代码:(演示

$string = 'piece1;piece2;piece3;piece4;piece5;piece6;piece7;piece8;';

var_export(preg_split('/(?:[^;]*;){3}\K/', $string, 0, PREG_SPLIT_NO_EMPTY));

可以在这里找到每 2 个事物之后进行分割的类似技术。该片段实际上在最后一个空格字符之前写入

\K
,以便在分割时消耗尾部空格。

© www.soinside.com 2019 - 2024. All rights reserved.