2012-09-13 212 views
5

我正在寻找将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

什么是目标语言? – dasblinkenlight

+0

php .. sry忘记提及 –

+0

添加标签可提高您的问题的可见度。 – dasblinkenlight

回答

2

或者,如果你想避免预浸:

$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; 
} 
+0

使用间隔使其更易于维护。 +1的解决方案。 –

+0

对不起,不起作用。在unicode的情况下按代码单位拆分,而不是字符。 –

+0

'$ parts [] = mb_substr($ string,$ start,$ i,mb_detect_encoding($ string));'? – noj

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

    if (preg_match('~(.{2})(.{1})(.{8})(.{4})(.{20})(.{8})~u', $s, $match)) 
    { 
     list (, $type, $status, $id, $settings, $name, $date) = $match; 
    } 
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建议)其他可能是要走(更灵活)的方式。 (如图所示,这仍然是一个备选选项)。

0

这是不可能分裂在你问的方式unicode字符串。

不可能不使零件无效。 某些代码点无法突出显示,例如:שׁ是2个代码点(UTF-8和UTF-16中有4个字节),并且由于未定义而无法分割。

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

+1

+1。 Unicode对于某些事情来说非常棒,但是对字符串处理的处理非常复杂。 (你确定这是“不可能的”,但也许只是“非常困难”?) – ghoti

+0

是的,ghoti,问什么是不可能的。我想我解释了为什么,不是吗? –