2012-09-13 245 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,問什麼是不可能的。我想我解釋了爲什麼,不是嗎? –