2012-09-13 3 views
5

Je cherche des façons de diviser une chaîne d'un type alphanumérique unicode en longueurs fixes. par exemple:Séparer la chaîne par longueur fixe

 

    992000199821376John Smith   20070603 

et le tableau devrait ressembler à ceci:

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

données du tableau seront répartis comme suit:

 
    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

Quelle est la langue cible? – dasblinkenlight

+0

php .. sry oublié de mentionner –

+0

Ajout d'un tag donne à votre question une meilleure visibilité. – dasblinkenlight

Répondre

2

Ou si vous voulez éviter 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

L'utilisation d'intervalles le rend beaucoup plus facile à maintenir. +1 pour cette solution –

+0

Désolé, ne fonctionne pas. Divise par unités de code en cas d'unicode, pas de caractères. –

+0

Que diriez-vous de '$ parts [] = mb_substr ($ chaîne, $ start, $ i, mb_detect_encoding ($ chaîne));'? – 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

Utilisation de la fonction substr ferait ceci assez facilement.

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

devrait faire l'affaire, autre que celle des expressions régulières (comme le suggère akond) est probablement la voie à suivre (et plus souple). (Figuré c'était encore valide comme une option alternative).

0

Il est impossible de diviser une chaîne unicode d'une manière que vous demandez.

Impossible sans rendre les pièces invalides. Certains points de code n'ont aucun moyen de se démarquer, par exemple: שׁ est de 2 points de code (et 4 octets en UTF-8 et UTF-16) et vous ne pouvez pas le diviser car il est indéfini. Lorsque vous travaillez avec unicode, "caractère" est un terme très glissant. Il y a des points de code, des glyphes, etc. Voir plus à http://www.utf8everywhere.org, la partie sur "la longueur d'une chaîne"

+1

+1. Unicode est génial pour certaines choses, mais complique énormément la gestion des chaînes. (Etes-vous sûr que c'est "pas possible" cependant? Peut-être seulement "très difficile"?) – ghoti

+0

Oui, ghoti, ce qui est demandé n'est pas possible. Je pensais avoir expliqué pourquoi, n'est-ce pas? –

Questions connexes