2012-09-13 8 views
5

Poszukuję sposobów podziału ciągu znaków alfanumerycznych Unicode na stałe długości. na przykład:Podział na ciąg o stałej długości

 

    992000199821376John Smith   20070603 

i tablica powinna wyglądać następująco:

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

dane array zostaną podzielone tak:

 
    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

Jaki jest język docelowy? – dasblinkenlight

+0

php .. sry zapomniałem wspomnieć o –

+0

Dodanie tagu daje twoje pytanie lepszej widoczności. – dasblinkenlight

Odpowiedz

2

Lub jeśli chcesz uniknąć 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; 
} 
+0

Używanie interwałów sprawia, że ​​jest on dużo łatwiejszy w utrzymaniu. +1 dla tego rozwiązania. –

+0

Niestety, nie działa. Dzieli się przez jednostki kodu w przypadku unicode, a nie znaków. –

+0

Co powiesz na '$ 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

Korzystanie z funkcji substr zrobi to całkiem łatwo.

$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)); 

Powinien zrobić lewę, inne niż wyrażeń regularnych (jak sugeruje akond) jest prawdopodobnie droga do pracy (i bardziej elastyczne). (Wyliczyłem, że jest to nadal ważne jako opcja alternatywna).

0

nie jest możliwe, aby podzielić ciąg Unicode w sposób prosić.

Niemożliwe bez wykonania części niepoprawnych. Niektóre punkty kodowe nie mają możliwości wyróżnienia się, na przykład: שׁ jest 2 punktami kodowymi (i 4 bajtami w UTF-8 i UTF-16) i nie można go podzielić, ponieważ jest niezdefiniowany.

Podczas pracy z unikodem, "znak" jest bardzo śliskim terminem. Istnieją punkty kodowe, glify itp. Zobacz więcej na http://www.utf8everywhere.org, część "długość struny"

+1

+1. Unicode świetnie nadaje się do niektórych rzeczy, ale bardzo mocno komplikuje obsługę ciągów. (Czy na pewno jest to "niemożliwe"? Być może tylko "bardzo trudne"?) – ghoti

+0

Tak, ghoti, to, o co się pytamy, nie jest możliwe. Myślałem, że wytłumaczyłem dlaczego, prawda? –