7

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

    992000199821376约翰·史密斯 20070603

并且数组应如下所示:

Array (
 [0] => 99,
 [1] => 2,
 [2] => 00019982,
 [3] => 1376,
 [4] => "John Smith",
 [5] => 20070603
) 

数组数据将像这样拆分:

    Array[0] - 帐户类型 - 必须为 2 个字符长,
    Array[1] - 帐户状态 - 必须为 1 个字符长,
    Array[2] - 帐户 ID - 长度必须为 8 个字符,
    Array[3] - 帐户设置 - 长度必须为 4 个字符,
    Array[4] - 用户名 - 长度必须为 20 个字符,
    Array[5] - 加入日期 - 长度必须为 8 个字符。
4

4 回答 4

4

或者,如果您想避免怀孕:

$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;
}
于 2012-09-13T13:19:09.133 回答
0
    $s = '992000199821376Николай Шмидт       20070603';

    if (preg_match('~(.{2})(.{1})(.{8})(.{4})(.{20})(.{8})~u', $s, $match))
    {
        list (, $type, $status, $id, $settings, $name, $date) = $match;
    }
于 2012-09-13T13:03:37.957 回答
0

使用 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所建议的那样)可能是要走的路(而且更灵活)。(认为​​这仍然是有效的替代选项)。

于 2012-09-13T13:16:50.237 回答
0

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

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

当您使用 unicode 时,“字符”是一个非常模糊的术语。有代码点、字形等。在http://www.utf8everywhere.org上查看更多信息,关于“字符串长度”的部分

于 2012-09-13T21:21:38.087 回答