Parsing stringa

di il
3 risposte

Parsing stringa

Ciao Ragazzi, mi serve una mano.

Ho un file con una serie di stringhe con il nome dei calciatori, il ruolo, il numero, ecc..

{{Calciatore in rosa|n°=1|nazione=Brasile|nome=[[Dida]]|ruolo=P}}
{{Calciatore in rosa|n°=32|nazione=Brasile|nome=[[Dida2]]|ruolo=P}}
{{Calciatore in rosa|n°=54|nazione=Brasile|nome=[[Dida3]]|ruolo=P}}
{{Calciatore in rosa|n°=3|nazione=Brasile|nome=[[Dida4]]|ruolo=P}}
{{Calciatore in rosa|n°=6|nazione=Brasile|nome=[[Dida5]]|ruolo=P}}
{{Calciatore in rosa|n°=7|nazione=Brasile|nome=[[Dida6]]|ruolo=P}}
{{Calciatore in rosa|n°=10|nazione=Brasile|nome=[[Dida7]]|ruolo=P}}
{{Calciatore in rosa|n°=11|nazione=Brasile|nome=[[Dida8]]|ruolo=P}}
{{Calciatore in rosa|n°=16|nazione=Brasile|nome=[[Dida9]]|ruolo=P}}
come posso fare per recuperare solamente il nome ed il numero di ognuno?

3 Risposte

  • Re: Parsing stringa

    mist3r0 ha scritto:


    Ciao Ragazzi, mi serve una mano.
    Ho un file con una serie di stringhe con il nome dei calciatori, il ruolo, il numero, ecc..
    come posso fare per recuperare solamente il nome ed il numero di ognuno?
    Ciao mistero io ti propongo di usare le espressioni regolari per estrarre solo quei due dati, e poi tramite un ciclo FOR comporre un array multidimensionale in cui ogni record è formato da nome e numero. Dà un'occhiata:
    $string = "{{Calciatore in rosa|n°=1 ...eccetera";
    
    # Estraggo solo numero e nome e li salvo nell'array $matches
    preg_match_all('/.+n\xB0\x3D(?P<numero>\d{1,2}).+nome\x3D(?P<nome>[^\x7C]+).+/', $string, $matches);
    
    # Per ogni record costruisco un array multidimensionale con nome e numero calciatore
    for ($i=0; $i<count($matches[0]); $i++)
    	$calciatori []= array ("nome" => $matches["nome"][$i], "numero" => $matches["numero"][$i]);
    In questo modo dovrebbe risultarti un array $calciatori con tanti record (in questo caso 10) strutturato come segue:
    Array (
        [0] => Array (
                [nome] => [[Dida]]
                [numero] => 1
            )
        [1] => Array (
                [nome] => [[Dida2]]
                [numero] => 32
            )
        ... eccetera
    )
    Avevi questo in mente o altro? Ciao!
  • Re: Parsing stringa

    La soluzione che ti hanno dato prima è la migliore

    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

    Ciao



    --------------------------------
    Prosciutto Crudo Parma
  • Re: Parsing stringa

    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
Devi accedere o registrarti per scrivere nel forum
3 risposte