Php 按固定长度拆分字符串

Php 按固定长度拆分字符串,php,string,unicode,split,fixed,Php,String,Unicode,Split,Fixed,我正在寻找将unicode字母数字类型的字符串拆分为固定长度的方法。 例如: 992000199821376John Smith 20070603 数组数据将按如下方式拆分: Array ( [0] => 99, [1] => 2, [2] => 00019982, [3] => 1376, [4] => "John Smith", [5] => 20070603 ) Array[0] - Account type - mus

我正在寻找将unicode字母数字类型的字符串拆分为固定长度的方法。 例如:

992000199821376John Smith 20070603 数组数据将按如下方式拆分:

Array (
 [0] => 99,
 [1] => 2,
 [2] => 00019982,
 [3] => 1376,
 [4] => "John Smith",
 [5] => 20070603
) 
Array[0] - Account type - must be 2 characters long, Array[1] - Account status - must be 1 character long, Array[2] - Account ID - must be 8 characters long, Array[3] - Account settings - must be 4 characters long, Array[4] - User Name - must be 20 characters long, Array[5] - Join Date - must be 8 characters long. 数组[0]-帐户类型-长度必须为2个字符, 数组[1]-帐户状态-长度必须为1个字符, 数组[2]-帐户ID-长度必须为8个字符, 数组[3]-帐户设置-长度必须为4个字符, 数组[4]-用户名-长度必须为20个字符, 数组[5]-加入日期-长度必须为8个字符。
使用substr函数可以很容易地做到这一点

$accountDetails = "992000199821376John Smith          20070603";
$accountArray = array(substr($accountDetails,0,2),substr($accountDetails,2,1),substr($accountDetails,3,8),substr($accountDetails,11,4),substr($accountDetails,15,20),substr($accountDetails,35,8));

除了正则表达式(正如akond所建议的那样)可能是一种方法(而且更灵活)之外,我们应该做到这一点。(我想这仍然是一个有效的替代选项)。

或者如果您想避免preg:

$string = '992000199821376John Smith          20070603';
$intervals = array(2, 1, 8, 4, 20, 8);

$start = 0;
$parts = array();

foreach ($intervals as $i)
{
   $parts[] = mb_substr($string, $start, $i);

   $start += $i;
}

无法按您要求的方式拆分unicode字符串

如果不使零件失效,则不可能。 有些代码点无法突出,例如:שׁ是2个代码点(UTF-8和UTF-16中有4个字节),您无法拆分它,因为它未定义


在使用unicode时,“字符”是一个很难理解的术语。这里有代码点、标志符号等。请参阅“字符串长度”部分的更多内容。

添加标记可以让您的问题更直观。在unicode中不可能这样做(仅适用于ascii)。曾经看看我的答案。使用间隔可以让它更易于维护+1用于此解决方案。抱歉,不起作用。在使用unicode的情况下,按代码单位拆分,而不是按字符拆分。
$parts[]=mb_substr($string,$start,$i,mb_detect_encoding($string))
?@jonnynnoj:我认为在这里使用
mb\u-detect\u编码是不可靠的。此外,还应计算石墨烯簇,而不是代码点。Unicode在某些方面很好,但会使字符串处理变得非常复杂。(你确定这是“不可能”的吗?也许只是“非常困难”?)是的,戈蒂,所问的是不可能的。我想我解释了原因,不是吗?
$string = '992000199821376John Smith          20070603';
$intervals = array(2, 1, 8, 4, 20, 8);

$start = 0;
$parts = array();

foreach ($intervals as $i)
{
   $parts[] = mb_substr($string, $start, $i);

   $start += $i;
}