tapper ha scritto:
Aggiungo anche che potresti usare la funzione explode() (spiegata in dettaglio su php.net), lavorando ciclicamente su ogni riga (bisogna anche ricordarsi di evitare le prime e ultime graffe nella stringa).
Lo dico solo perchè a volte le espressioni regolari sono un po' difficili da capire e modificare (le prime volte), ma comunque restano la soluzione più corretta
Si beh effettivamente una regex è piuttosto dura da capire se non l'hai fatta tu, o anche se l'hai sviluppata due mesi fa può diventare ugualmente incomprensibile ma effettivamente questo metodo spezzetta la stringa in una singola linea di codice, evitando una trafila più lunga di cicli e comandi.
Per fare un esempio, provo a seguito ad usare metodi alternativi alle regex, cercando di stringare al massimo i byte utilizzati (poi lo spiego passo a passo). Per comodità ho usato solo due righe di calciatori:
$stringa = "{{Calciatore in rosa|n°=1|nazione=Brasile|nome=[[Dida]]|ruolo=P}}
{{Calciatore in rosa|n°=32|nazione=Brasile|nome=[[Dida2]]|ruolo=P}}"
foreach(explode("\n",$stringa) as $linea):
foreach(explode("|",substr($linea,2,strlen($linea)-2)) as $campo){
if(count(($split=explode("=",$campo,2)))>1) $calciatori[$split[0]]=$split[1];
else $calciatori[]=$split[0];
}
endforeach;
Sono poche righe, ma dentro c'è una frenetica esecuzione. Prima di tutto parte un ciclo FOREACH che tratta la stringa dei calciatori come un array, del quale ogni elemento corrisponde ad una riga della stringa, indi parte un secondo ciclo FOREACH interno che prende in considerazione tutta la linea tranne i primi e gli ultimi due caratteri (le parentesi graffe) e la divide attraverso i simboli di pipe (|). A questo punto verifica se è presente nel frammento esaminato il carattere di uguale (=) assegnando allo stesso tempo il valore, diviso o meno, ad un array; se tale array conta più di un elemento, significa che è stato diviso in due in corrispondenza di un uguale, altrimenti significa che non v'erano uguali al suo interno. Nel primo caso l'array $calciatori aggiunge una coppia chiave-valore corrispondente a ciò che si trova prima e ciò che si trova dopo l'uguale, nel secondo caso invece all'array in questione viene aggiunto solo il valore, mentre la chiave viene generata automaticamente (un intero positivo autoincrementale, da 0 in su). Fine.
Se dunque si prova a stampare tramite print_r l'array generato $calciatori, si avrà un risultato del genere (sempre con soli due calciatori):
Array (
[0] => Calciatore in rosa
[n°] => 1
[nazione] => Brasile
[nome] => [[Dida]]
[ruolo] => P
)
Array (
[0] => Calciatore in rosa
[n°] => 32
[nazione] => Brasile
[nome] => [[Dida2]]
[ruolo] => P
)
Ciao