Php 如何找到字符串拆分的解决方案?

Php 如何找到字符串拆分的解决方案?,php,string,laravel-5,Php,String,Laravel 5,我有一个字符串数组。像这样的 $preorder[] = " iPhone 7/7 plus\n \n 7 32Gb Jet B 1778 AA/A - 1 550\n 7 32Gb Jet B 1778 HN/A - 50\n 7 32Gb Jet B 1778 - 1 500\n 7 32Gb Jet B 1778 LE/A - 1 550\n 7 32Gb Jet B 1778 AH/A -

我有一个字符串数组。像这样的

$preorder[] = "
         iPhone 7/7 plus\n
      \n
       7 32Gb Jet B 1778 AA/A - 1 550\n
       7 32Gb Jet B 1778 HN/A - 50\n
       7 32Gb Jet B 1778 - 1 500\n
       7 32Gb Jet B 1778 LE/A - 1 550\n
       7 32Gb Jet B 1778 AH/A - 1 600\n
       7 32Gb Jet B 1778 VC/A - 1 550\n
       7 32Gb Jet B 1778 MY/A - 1 550\n
       7 32Gb Jet B 1778 2B/A - 1 550\n
      \n
       7 128Gb Black 1778 2B/A - 1 550\n
       7 128Gb Black 1778 VC/A - 1 550\n
      \n
       7 256Gb Black 1778 2B/A - 1 550\n
      \n
       7 128Gb Jet B 1778 VC/A - 1 550\n
      \n
       7 256Gb Black 1778 AH/A - 1 600\n
       7 256Gb Black 1778 AA/A - 1 550\n
       7 256Gb Black 1778 HN/A - 50\n
       7 256Gb Red 1778 MY/A - 1 550\n
      \n
       7 Plus 32Gb Black 1784 2B/A - 1 800\n
      \n
       7 256Gb Jet B 1778 MY/A - 4 950\n
       7 256Gb Jet Black 1778 - 1 500\n
       7 256Gb Jet B 1778 AH/A - 1 600\n
       7 256Gb Jet B 1778 HN/A - 50\n
      \n
       7 Plus 32Gb Silver 1784 2B/A - 5 200\n
       7 Plus 32Gb Black 1784 LE/A - 1 700\n
       7 Plus 32Gb Black 1784 HN/A - 50\n
       7 Plus 32Gb Black 1784 - 1 700\n
       7 Plus 32Gb Gold 1784 HN/A - 50\n
       7 Plus 32Gb Gold 1784 LE/A - 1 700\n
       7 Plus 32Gb Gold 1784 MY/A - 1 800\n
       7 Plus 32Gb Rose 1784 MY/A - 5 200\n
      \n
       7 Plus 128Gb Black 1784 2B/A - 5 200\n
        ";
这是一些产品的清单,我会发电报的。但电报对信息长度有限制。因此,如果我的消息超过4000个字符,我需要将其拆分为2条消息

但用空行分割这个字符串是个糟糕的解决方案。所以我不知道怎么才能让这根绳子看起来像

$msg[] = "
         iPhone 7/7 plus\n
      \n
       7 32Gb Jet B 1778 AA/A - 1 550\n
       7 32Gb Jet B 1778 HN/A - 50\n
       7 32Gb Jet B 1778 - 1 500\n
       7 32Gb Jet B 1778 LE/A - 1 550\n
       7 32Gb Jet B 1778 AH/A - 1 600\n
       7 32Gb Jet B 1778 VC/A - 1 550\n
       7 32Gb Jet B 1778 MY/A - 1 550\n
       7 32Gb Jet B 1778 2B/A - 1 550\n
      \n
       7 128Gb Black 1778 2B/A - 1 550\n
       7 128Gb Black 1778 VC/A - 1 550\n";
       $msg[]="
      \n
       7 256Gb Black 1778 2B/A - 1 550\n
      \n
       7 128Gb Jet B 1778 VC/A - 1 550\n
      \n
       7 256Gb Black 1778 AH/A - 1 600\n
       7 256Gb Black 1778 AA/A - 1 550\n
       7 256Gb Black 1778 HN/A - 50\n
       7 256Gb Red 1778 MY/A - 1 550\n";
       $msg[] = "
      \n
       7 Plus 32Gb Black 1784 2B/A - 1 800\n
      \n
       7 256Gb Jet B 1778 MY/A - 4 950\n
       7 256Gb Jet Black 1778 - 1 500\n
       7 256Gb Jet B 1778 AH/A - 1 600\n
       7 256Gb Jet B 1778 HN/A - 50\n
      \n
       7 Plus 32Gb Silver 1784 2B/A - 5 200\n
       7 Plus 32Gb Black 1784 LE/A - 1 700\n";
       $msg[] = "
       7 Plus 32Gb Black 1784 HN/A - 50\n
       7 Plus 32Gb Black 1784 - 1 700\n
       7 Plus 32Gb Gold 1784 HN/A - 50\n
       7 Plus 32Gb Gold 1784 LE/A - 1 700\n
       7 Plus 32Gb Gold 1784 MY/A - 1 800\n
       7 Plus 32Gb Rose 1784 MY/A - 5 200\n
      \n
       7 Plus 128Gb Black 1784 2B/A - 5 200\n
        ";
所以我想把字符串分成几部分,然后把它们组成一个数组,然后把它发送给电报。我的绳子可能有20000个字符长。所以我需要一种动态的方式来分割它。 有什么建议吗?谢谢

我解决了我的问题

$lines = preg_split ('/$\R?^/m',  $preorder[1]);
        $arrays = array_chunk($lines,100);
        $new_line = [];
        foreach($arrays as $key => $value) {
            $new_line[] = implode("\r\n",$value);
        }

感谢@sietse85提供数组块。

您可以循环分解的新行数组,并计算每行中的字符数。
在msgcount中求和,只要少于4000个字符,就一直添加到字符串中,一旦超过4000个字符,就将其拆分并创建一个新的数组项。
完成所有循环后,str中仍有on消息,请添加该消息并完成。
我也在数组中添加了计数

$msgcount = 0;
$str = "";
foreach(explode(PHP_EOL, $preorder[0]) as $item){
    $line = trim($item);
    $count = strlen($line);
    if($line == "") continue;

    if($msgcount + $count <= 4000){
        $str .= PHP_EOL . $line;
        $msgcount += $count+1;
    }else{
        $new[] = ["msg" => trim($str), "count" => $msgcount-1];
        $str = "";
        $msgcount = 0;
    }
}

$new[] = ["msg" => trim($str), "count" => $msgcount-1];


var_dump($new);
$msgcount=0;
$str=”“;
foreach(分解(PHP_EOL,$preorder[0])为$item){
$line=trim($item);
$count=strlen($line);
如果($line==“”)继续;
如果($msgcount+$count trim($str),“count”=>$msgcount-1];
$str=”“;
$msgcount=0;
}
}
$new[]=[“msg”=>trim($str),“count”=>$msgcount-1];
var_dump(新);

那么你试过什么?试着使用
preg\u match\u all()
来实现这一点purpose@sietse85preg_match_all拆分字符串?您不认为还有其他更轻的函数可以使用吗?
explode(“\n”,$preorder)
也许然后分块数组或类似的东西,有很多解决方法…他还没有展示他尝试过的东西,所以…这就是
http://php.net/array_chunk
有一个额外的注意事项:尝试使用
PHP\u EOL
而不是
\r\n