La cosa non e' cosi' semplice. Intanto il primo errore e' che le quadre non vanno precedute da un backslash, altrimenti perdono il loro significato di metacarattere e indicano una semplice quadra cosi' com'e'. Poi il tuo pattern cerca solo tag di un singolo carattere maiuscolo. Inoltre bisogna usare il backreferencing per accoppiare il tag di apertura con il suo "gemello" di chiusura.
Questo codice funziona con il tuo testo di esempio:
Codice PHP:
$testo = '<p class="prova">Questo è il paragrafo da estraplare.</p>
<p class="esempio">Questo non va estrapolato</p>
<ul class="prova">[*]Anche queste[*]linee vengo estrapolate[/list]';
preg_match_all("#<([a-z]+) class=\"prova\">(.*)<(/\\\\1)>#isU", $testo, $result);
print_r($result);
E' una versione migliorabile (e non garantisco che funzioni sempre
).
Ad esempio quel pattern non trova:
- tag con i numeri come <h1 class="prova"> (basta cambiare [a-z] in [a-z0-9], o anche [a-z1-6] se gli h sono gli unici tag con un numero (la mia memoria e' quello che e' non ne sono sicuro
))
- tag con altri attributi come <p class="prova" id="paragrafo1">
- tag formattati in maniera leggermente diversa, ad esempio con 2 o piu' spazi tra il nome e "class", o con uno o piu' spazi prima del ">" di chiusura tag
Il concetto pero' e' quello.
Fondamentali sono i flag "isU" alla fine del pattern:
- i significa case-insensitive
- s significa che il punto "matcha" anche il carattere di newline, quindi permette i match multiriga
- U significa "ungreedy" cioe' dice di "matchare" il meno possibile, mentre il comportamento di default delle regexp e' "avido". Senza quel flag il tag gemello del primo <p e' il </p> che si trova alla fine di "Questo non va estrapolato", proprio perche' il pattern cerca di "prendere" quanto piu' possibile.
Spero di essermi spiegato abbastanza bene, le regexp sono un argomento molto vasto e difficile da condensare in poche righe