按固定长度拆分字符串

时间:2012-09-13 10:36:43

标签: 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 - 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.

4 个答案:

答案 0 :(得分:4)

或者如果你想避免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;
}

答案 1 :(得分:0)

    $s = '992000199821376Николай Шмидт       20070603';

    if (preg_match('~(.{2})(.{1})(.{8})(.{4})(.{20})(.{8})~u', $s, $match))
    {
        list (, $type, $status, $id, $settings, $name, $date) = $match;
    }

答案 2 :(得分: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所建议的)之外,应该可以做到这一点(可能是更好的方式)。 (想象这仍然是另一种选择)。

答案 3 :(得分:0)

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

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

当你使用unicode时,“character”是一个非常滑的术语。有代码点,字形等。请参阅http://www.utf8everywhere.org的更多信息,关于“字符串长度”的部分