2012-09-13 20 views
5

Estoy buscando formas de dividir una cadena de tipo alfanumérico unicode en longitudes fijas. por ejemplo:División de cadena por longitud fija

 

    992000199821376John Smith   20070603 

y la matriz debe tener este aspecto:

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

datos de la matriz se repartirán así:

 
    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

¿Cuál es el idioma de destino? – dasblinkenlight

+0

php .. sry olvidó mencionar –

+0

Agregar una etiqueta le da a su pregunta una mejor visibilidad. – dasblinkenlight

Respuesta

2

O si se quiere evitar 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

El uso de intervalos hace que sea mucho más fácil de mantener. +1 para esta solución. –

+0

Lo siento, no funciona. Divide por unidades de código en caso de unicode, no caracteres. –

+0

¿Qué tal '' 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

Uso de la función substr haría esto bastante fácilmente

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

debe hacer el truco, aparte de que las expresiones regulares (como se sugiere por akond) es probablemente el camino a seguir (y más flexible). (Supuse que esto todavía era válido como una opción alternativa).

0

No es posible dividir una cadena Unicode de manera que pide.

No es posible sin hacer que las piezas no sean válidas. Algunos puntos de código no tienen forma de destacarse, por ejemplo: שׁ es 2 puntos de código (y 4 bytes en UTF-8 y UTF-16) y no se puede dividir porque no está definido.

Cuando trabajas con unicode, "carácter" es un término muy resbaladizo. Hay puntos de código, glifos, etc. Ver más en http://www.utf8everywhere.org, la parte en "longitud de una cadena"

+1

+1. Unicode es ideal para algunas cosas, pero complica tremendamente el manejo de cadenas. (¿Estás seguro de que "no es posible"? ¿Tal vez solo "muy difícil"?) – ghoti

+0

Sí, ghoti, lo que se pide no es posible. Pensé que había explicado por qué, ¿no? –

Cuestiones relacionadas