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?

È stato utile?

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:
    1. ... 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'attributo class.
    2. ... >)(.*)<\/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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top