2012-07-08 4 views
5

Sto cercando modi per dividere una stringa in una matrice, una sorta di str_split(), in cui i blocchi sono tutti di dimensioni diverse.suddivisione stringa php in blocchi di lunghezza variabile

Potrei farlo collegando la stringa con un gruppo di substr(), ma non sembra né elegante né efficiente. Esiste una funzione che accetta una stringa e un array, come (1, 18, 32, 41, 108, 125, 137, 152, 161), e produce una serie di pezzi di stringa opportunamente tagliati?

L'esplosione è inappropriata perché i blocchi sono delimitati da numeri variabili di spazi bianchi.

+0

un esempio per favore? – hjpotter92

+0

Creare una funzione! :) – Samson

+0

Hai controllato la funzione php explode()? –

risposta

7

Non c'è niente in PHP che lo farà per te (è un po 'specifico). Così come radashk solo siad, basta scrivere una funzione

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

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

    return $parts; 
} 

Qualcosa del genere. È quindi possibile utilizzarlo ovunque ti piace, quindi è pulito:

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

Se davvero volesse, si potrebbe implodere in un'espressione regolare:

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

sarebbe corrispondere a ciò che si voleva.

+0

Grazie Jay. Sono arrivato alla stessa conclusione! – aag

0

Una variante leggermente più flessibile, utile per analizzare le tabelle ASCII con record a lunghezza fissa:

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

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

return $parts; 
} 

presentando i seguenti:

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

rendimenti:

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

La posizione $ non è definita qui – MimiEAM

2

Solo per riferimenti futuri il metodo delle espressioni regolari @jay suggerito va così:

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

dove $ myfixedlengthstring è la stringa di destinazione e $ arr ti dà il risultato