在每个 5 位数字字符串之前分割字符串,后跟关键字

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

我有一个像

$str
这样的字符串。

$str = "**00016**cam 3212543**00022**cam 3212543123153**00020**cam 32125433153";

我想像这样将它分成数组。 “cam”之前的数字是字符串长度。

$splitArray = ["00016cam 3212543", "00022cam 3212543123153", "00020cam 32125433153"]

我尝试过以下代码:

$lengtharray = array(); 
while ($str != null) 
{ 
     $sublength = substr($str, $star, $end); 
     $star += (int)$sublength; // echo $star."<br>"; // echo $sublength."<br>"; 
     if($star == $total)
     { 
         exit; 
     }
     else
     { 

     } 

      array_push($lengtharray, $star); // echo 
      print_r($lengtharray); 
}
php split
3个回答
4
投票

您可以尝试这个 1 行解决方案

$str = explode('**', preg_replace('/\**cam/', 'cam', $str)) ;

0
投票

如果您的字符串不包含星号,那么恐怕您需要编写一个简单的解析器来:

  • 从左侧取出字符,直到不是数字为止
  • substr
    有长度
  • 对未消耗的字符串重复前面的步骤

    <?php
    
    $input = "00016cam 321254300022cam 321254312315300020cam 32125433153";
    
    function parseArray(string $input)
    {
        $result = [];
    
        while ($parsed = parseItem($input)) {
            $input = $parsed['rest'];
            $result[] = $parsed['item'];
        }
    
        return $result;
    }
    
    function parseItem(string $input)
    {
        $sLen = strlen($input);
        $len = '';
        $pos = 0;
        while ($pos < $sLen && is_numeric($input[$pos])) {
            $len .= $input[$pos];
            $pos++;
        }
    
        if ((int) $len == 0) {
            return null;
        }
    
        return [
            'rest' => substr($input, $len),
            'item' => substr($input, 0, $len)
        ];
    }
    
    var_dump(parseArray($input));
    

0
投票

这段代码对我有用。希望有帮助。

$str = "**00016**cam 3212543**00022**cam 3212543123153**00020**cam 32125433153";
$arr = explode("**", $str);
for ($i=1; $i < sizeof($arr); $i=$i+2) 
    $arr_final[]=$arr[$i].$arr[$i+1];
© www.soinside.com 2019 - 2024. All rights reserved.