PDA

Visualizza la versione completa : Espressioni regolari e PHP


settolo
20-12-2004, 13:04
Le espressioni regolari sono Perl, ma mi servono in PHP. Ho postato in entrambi i forum.
Premetto che ho letto tutto quello che ho trovato sulle espressioni regolari, ma continuo a fare molta fatica a capirle.

Da una stringa di questo tipo
$stringa = "<span class="radice">
prima riga
<span>seconda riga</span>
terza riga
</span>
qualcos'altro
<span class="radice">
prima riga
<span>seconda riga</span>
terza riga
</span>";devo ottenere un Array che contenga nei vari elementi tutto il contenuto dello span di classe "radice" ed un intero che rappresenti il numero di ricorrenze.
Per ora, il meglio che sono riuscito a fare,

$itemregexp = "%radice *\" *>(.*?)</span>%is";
$match_count = preg_match_all($itemregexp, $stringa, $items);Ma in questo modo viene tagliata la terza riga di ogni span.
Come posso fare? Qual l'espressione regolare giusta, ammesso che esista?

Mich_
20-12-2004, 15:27
Se sei SICURO che in ogno pezzo c'e` uno /span>, potresti fare:

$itemregexp = "%radice *\" *\>(.+?\<\/span\>.+?)</span>%is";

Altrimenti le RE non sono lo strumento corretto da usare.

settolo
21-12-2004, 10:34
no, ce ne pu essere un numero qualunque, anche nessuno.
Ci speravo proprio ci fosse un modo semplice ed immediato... l'unica cosa di cui posso essere "sicuro" che ogni span aperto abbia la sua chiusura...

Mich_
21-12-2004, 11:51
Allora non ti resta che "scannerizzare" la stringa contando il numero di "\<span.+?\>" e di "\<\/span\>" finche` non chiudi il tutto.
E` una cosa un po' pesante, ma ti posto uno schema (fatto per il Perl, pero`; adattarlo al PHP devi farlo tu).


my spancount=0;
my $punt = 0;
$_ = ...la tua stringa completa;
while(/.*?(\<span.*?\>)|(\<\/span\>)(.*)$/si) {
if(length($1)>1) { spancount++; }
if(length($2)>1) { spancount--; }
if(spancount==0) { break; }
$_ = $3;
}
my $pezzo = substr($_,0,$+[3]);

A questo punto (salvo errori), il $pezzo comprende tutto lo span piu` esterno.

Se metti il while dentro un altro while(1) con break se length($_) < 3 e $pezzo lo fai diventare una array, hai spezzato la tua stringa in tanti piccoli pezzi contententi ciascuno uno <span ...</span> di primo livello.

settolo
21-12-2004, 12:16
grazie mille!

Loading