Newsgroup: it.comp.www.php
Titolo: Parsing di una stringa

Quale algoritmo consigliate per analizzare una stringa secondo una certa
maschera?
Mi spiego meglio:
Supponiamo di avere questa stringa "h987020705" e che sia l'unione di due
informazioni ovvero un codice ("h987") e una data ("020705" --> 05/07/02).
La maschera della stringa è sempre "ccccyymmdd" con ovvio significato
delle lettere.
Qual'è il miglior metodo, a vostro giudizio, per creare un array
contenente le informazioni di tale stringa, del tipo: 
$array['code']="h987" $array['year']="02" $array['month']="07"
$array['day']="05".
Ciao e grazie,
Nico
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Nico
$stringa = "h987020705";
$a = array(
 "codice"=>substr ($stringa,0,4),
 "anno"=>substr ($stringa,4,2),
 "mese"=>substr ($stringa,6,2),
 "giorno"=>substr ($stringa,8,2)
);
echo $a['codice']."<br>";
echo $a['anno']."<br>";
echo $a['mese']."<br>";
echo $a['giorno']."<br>";

 wrote in message
news:4ofV8.110780$j65.2...@twister1.libero.it...

Proposte per il codice piu' corto possibile (senza l'echo)?

<?
$Stringa="h987020705";
$Maschera="ccccyymmgg";
$Temp="";
for ($i=0;$i<strlen($Stringa)+1;$i++)
{
if ($Temp=="" || substr($Temp,-1)==substr($Maschera, $i, 1))
  {
    $Temp.=substr($Maschera, $i, 1);
  }
else
  {
  //Qui al posto di queste righe sotto devi mettere
  //i valori in delle array,ho messo l'esempio pero' non mi funziona(bohhhh)
//  $a=array($Cont_Array=>substr($Stringa,$i-strlen($Temp),strlen($Temp)));
//  $Cont_Array+=1;
  echo substr($Stringa,$i-strlen($Temp),strlen($Temp))."<br>";
  $Temp=substr($Maschera, $i, 1);
  }
}
?>
Non l'ho provato tanto pero' sembra funzionare mi dispiace di + non so dirti
sono nuovo di questo linguaggio.
Tanto nuovo che non so usare gli array.
Ciao.

 Proposte per il codice piu' corto possibile (senza l'echo)?
Se uno si accontenta di un array numerico...
$stringa = "h987020705";
$a[]= substr ($stringa,0,4);
for ($i=4;$i<=8;$i=$i+2) {
 $a[] = substr ($stringa,$i,2);
}

Ah dimenticavo io considero la maschera diversa.
Cmq se la maschera e' sempre uguale allora non avevo capito scusa.

 wrote in message
news:A1hV8.111194$j65.2...@twister1.libero.it...

Dai, tutti e due! Numerico e associativo...

 Dai, tutti e due! Numerico e associativo...
Sembri il prof che mi dą i compiti :)
$stringa = "h987020705";
$chiavi = array (codice, anno, mese, giorno);
$a[$chiavi[0]]= substr ($stringa,0,4);
$k=1;
for ($i=4;$i<=8;$i=$i+2) {
    $a[$chiavi[$k]] = substr ($stringa,$i,2);
    $k++;
}

 }
Così sarà anche più figo ma missà che è più lungo di prima.. oltre al fatto
che ci si deve pensare 5 volte di più per farlo :)

 wrote in message
news:CthV8.111329$j65.2...@twister1.libero.it...

prova con sscanf...

 Sembri il prof che mi dą i compiti :)
Vorrei un po' stimulare a sapere meglio le funzioni di PHP. Vedo che tanti
si fermano con delle soluzioni subottimali.
Usare funzioni gia' pronti:
  + veloce nella esecuzione,
  + veloce da implementare,
  - da testare,
  - da documentare.

 prova con sscanf...
pensavi ad una roba tel tipo:
$stringa = "h987020705";
$maschera = "%04s%02d%02d%02d";
 
list($a['codice'], $a['anno'], $a['mese'], $a['giorno']) =
sscanf($stringa, $maschera);
Si, direi che è proprio quello che cercavo.
Grazie.


 Grazie.
Bingo... ;-))))
ma come maschera mettevo (solo perche' piu' corto, di solito meglio avere un
controllo).
"%4s%2s%2s%2s";

 $maschera = "%04s%02d%02d%02d";
----------------------------^-----^-----^
s al posto di d

Kavolo meglio che non invio + nulla,sono troppo principiante eheh.
Cmq l'ho fatto per aiutare,ma non credo abbiate bisogno di aiuto,ne ho +
bisogno io.
Magari ritornero' ad inviare messaggi  fra 10 anni scusate...

 prova con sscanf...
Bastava sapere che ci fosse :)
Hai ragione sul fatto che bisognerebbe studiare meglio.. e ti ringrazio del
suggerimento relativo a sscanf...
Uno dei problemi č che sul ng si trovano spesso soluzioni come quella che ho
proposto io all'inizio, proprio perchč coloro che ne sanno piů di quelli
come me, spesso lasciano correre e non correggono come hai fatto tu con me.
Io ho provato a dare il mio contributo per cercare di risolvere il
problema.. anche se era piuttosto macchinoso funzionava.. e probabilmente se
non fossi intervenuto tu sarebbe rimasto solo quello.
E' vero quindi che sarebbe meglio studiare di piů.. ma anche che ci fossero
piů interventi come il tuo.. al fine di cercare sempre di migliorarsi.

 wrote in message
news:5hjV8.111169$Kt3.2...@twister2.libero.it...

Mica male il tuo metodo, si puo' adattare ad altre esigenze in cui magari la
maschera cambia al volo... Ad esempio una interfaccia addattabile via
database.

Grazie troppo gentile cmq per far capire quanto sono principiante non ho
capito a cosa vorresti adattare la "cosa" che ho scritto io eheh.
Cmq grazie.

 wrote in message
news:NpjV8.111214$Kt3.2...@twister2.libero.it...

:-)
Il NG serve proprio a quello. Sai quanto ho imparato qui (o posti simili)?
Perche' 90% dei problemi _non_ trovi nei libri.
E per rimanere in tema:
Una soluzione interessante puo' essere fatta con una espressione regolare:
  preg_match('/^(....)(..)(..)(..)$/',$stringa,$a);
oppure
  preg_match('/^(....)(\d\d)(\d\d)(\d\d)$/',$stringa,$a);
bisogna solo modificare il risultato in $a.

 Cmq grazie.
che usi una maschera simbolica
$Maschera="ccccyymmgg";
magari con un mapping tipo:
case 'c': assegni a codice il valore preso in cui i codici erano consecutivi
case 'y': assegni a year
quando poi hai maschere diverse devi passare ad una funzione che prende i
dati solo la
maschera
function getData($stringa, $maschera)
{
    // tuo codice modificato
}
$a1=getData($stringa1, "ccccyymmgg");
$a2=getData($stringa2, "yymmgg");
$a3=getData($stringa3, "yymmggcccccc");
$a4=getData($stringa4, "cchhiimm");
$a5=getData($stringa5, "cccnnnaamggxxxxx"); // codice fiscale splittato
solo un esempio come si potrebbe sviluppare...


Era li che ti volevo :-) anche se trovo più "leggibile" sscanf.
Comunque grazie anche a Ic^A^rO e a tiventuno.
Ciao,
Nico

 Comunque grazie anche a Ic^A^rO e a tiventuno.
sscanf non è solo più leggibile.. è anche più veloce..
Essendo a conoscenza della cattiva fama in questo senso delle espressioni
regolari ho fatto un paio di test.. ed effettivamente uscivano tempi più
veloci con sscanf rispetto all'utilizzo dell'espressione regolare.
Sono pronto comunque ad essere smentito :)

 wrote in message
news:X7lV8.38108$Jj7.1...@news1.tin.it...

Ora ci vuole anche una soluzione con chunk_split!
;-)

 ;-)
$stringa = "h987020705";
$b = explode("|",chunk_split($stringa,2,"|"));
list($a['codice'], $a['anno'], $a['mese'], $a['giorno']) =
array (
$b[0].$b[1],
$b[2],
$b[3],
$b[4]
);
Com'č? Fa schifo a sufficienza? :))
Oppure anche con wordwrap... quasi uguale...
$stringa = "h987020705";
$b = explode("|",wordwrap($stringa,2,"|",1));
list($a['codice'], $a['anno'], $a['mese'], $a['giorno']) =
array (
$b[0].$b[1],
$b[2],
$b[3],
$b[4]
);
Se proprio invece non voglio scomodare funzioni strane..
list($a['codice'], $a['anno'], $a['mese'], $a['giorno']) =
array (
$stringa[0].$stringa[1].$stringa[2].$stringa[3],
$stringa[4].$stringa[5],
$stringa[6].$stringa[7],
$stringa[8].$stringa[9]
);
Ne ho approfittato per fare un po' di esercizi... suppongo che anche in
questi casi si possa fare di meglio visto i miei precedenti :)