2012-07-08 24 views
5

Estoy buscando maneras de dividir una cadena en una matriz, tipo de str_split(), donde los trozos son todos de diferentes tamaños.dividir cadena PHP en trozos de longitud variable

Podría hacerlo haciendo un bucle a través de la cadena con un grupo de substr(), pero que no se ve ni elegante ni eficiente. ¿Hay alguna función que acepte una cadena y una matriz, como (1, 18, 32, 41, 108, 125, 137, 152, 161), y produce una matriz de piezas de cuerda adecuadamente cortadas?

Explotar es inapropiado porque los trozos están delimitados por una cantidad variable de espacios en blanco.

+0

un ejemplo por favor? – hjpotter92

+0

Crear una función! :) – Samson

+0

¿Marcó la función php explode()? –

Respuesta

7

No hay nada en PHP que lo haga por usted (es un poco específico). Entonces, como radashk solo siad, solo tiene que escribir una función

function getParts($string, $positions){ 
    $parts = array(); 

    foreach ($positions as $position){ 
     $parts[] = substr($string, 0, $position); 
     $string = substr($string, $position); 
    } 

    return $parts; 
} 

Algo así. A continuación, puede utilizar siempre que lo desee, por lo que es limpia:

$parts = getParts('some string', array(1, ... 161)); 

Si realmente quisiera, podría implosionar en una expresión regular:

^.{1}.{18} <lots more> .{161}$ 

coincidiría con lo que quería.

+0

Gracias Jay. ¡Llegué a la misma conclusión! – aag

0

Una variante ligeramente más flexible, útil para analizar tablas ASCII con registros de longitud fija:

function ParseIrregularString ($string, $lengths) 
{ 
$parts = array(); 

foreach ($lengths as $StringKey => $position) 
    { 
    $parts[$StringKey] = substr($string, 0, $position); 
    $string = substr($string, $position); 
    } 

return $parts; 
} 

presentación de los siguientes:

$string = "abcdefghiklmnopqrstuvz"; 
$lengths = array ("field1"=>4, "field2"=>3, "field3"=>5, "field4"=>2); 
print_r (ParseIrregularString ($string, $lengths)); 

devuelve:

Array ([field1] => abcd [field2] => efg [field3] => hiklm [field4] => no) 
+0

$ posición no está definida aquí – MimiEAM

2

Sólo por futuras referencias al método de expresiones regulares @jay sugerido dice así:

$regex="/(.{1})(.{18})(.{32})(.{41})(.{108})(.{125})(.{137})(.{152})(.{161})/"; 
preg_match($regex,$myfixedlengthstring,$arr); 

donde $ myfixedlengthstring es la cadena de destino y $ matriz le da el resultado

Cuestiones relacionadas