problema RegEx - recuperare il contenuto dei tag con data classe - preg_match (_all)
-
16-09-2019 - |
Domanda
Ho bisogno di recuperare il contenuto dei tag <p>
con data classe. Classe potrebbe essere simplecomment
o comment
...
Così ho scritto il seguente codice
preg_match("|(<p class=\"(simple)?comment(.*)?\">)(.*)<\/p>|ism", $fcon, $desc);
Purtroppo, restituisce nulla. Tuttavia, se rimuovo tag fine parte (<\/p>
) funziona in qualche modo, returing la stringa che è troppo lungo (dall'inizio tag alla fine del documento) ...
Cosa c'è di sbagliato con la mia espressione regolare?
Soluzione
Provare a usare un parser DOM come http://simplehtmldom.sourceforge.net/
Se ho letto il codice di esempio sulla homepage di simplehtmldom correttamente si potrebbe fare qualcosa di simile
$html->find('div.simplecomment', 0)->innertext = '';
Altri suggerimenti
La soluzione rapida qui è la seguente:
'|(<p class="(simple)?comment[^"]*">)((?:[^<]+|(?!</p>).)*)</p>|is'
Modifiche:
- Il
(.*)
costrutto sarà solo corrispondere alla cieca tutto ciò, che ferma l'espressione regolare di lavorare, così ho sostituito quei casi completamente con le partite più severe:- ...
comment(.*)?
... - questo corrisponderà tutto o niente, in fondo. Ho sostituito questo con[^"]*
poiché ciò zero o più caratteri non"
(in pratica, esso corrisponderà fino al carattere chiusura"
dell'attributoclass
. - ...
>)(.*)<\/p>
... - di nuovo, questa corrisponderà troppo. Ho sostituito con un modello efficiente che abbinerà tutti i caratteri non<
, e una volta che colpisce un<
esso controllerà se è seguito da</p>
. Se lo è, si fermerà corrispondenza (visto che siamo alla fine del tag<p>
), altrimenti continuerà.
- ...
- I rimosso la bandiera
m
dato che non ha l'uso in questa espressione regolare.
Ma non sarà attendibile (immaginate <p class="comment">...<p>...</p></p>
, ma corrisponderà <p class="comment">...<p>...</p>
).
Per rendere più affidabile, avrete bisogno di utilizzare le espressioni regolari ricorsivi o (meglio ancora) un parser HTML (o XML se è XHTML hai a che fare con.) Ci sono anche le librerie là fuori in grado di gestire HTML malformato " correttamente"(come i browser).