2009-07-11 8 views
6

Ho un div id desidera rimuovere da un'uscita che sembraCome posso rimuovere un elemento html e il suo contenuto utilizzando RegEx

<div id="ithis" class="cthis">Content here which includes other elements etc..) </div> 

Come posso rimuovere questo div e tutto all'interno di esso utilizzando PHP e regex ?

Grazie.

+0

Puoi approfondire ulteriormente? È sotto forma di stringa? –

+1

conosci il nome dell'ID e/o il nome della classe? Oppure esistono identificatori distinti dell'ID e/o della classe in modo tale da non rimuovere tutte le div che rientrano in tale descrizione? O vuoi rimuovere tutte le div e il loro contenuto? –

risposta

13

La semplice risposta è che non è così. Invece, usi uno dei molti parser HTML di PHP. I regex sono un modo traballante e incline agli errori di manipolare l'HTML.

Detto questo si può fare questo:

$html = preg_replace('!<div\s+id="ithis"\s+class="cthis">.*?</div>!is', '', $html); 

Ma molte cose possono di sbagliato in questo. Ad esempio, se questo contiene un div:

<div id="ithis" class="cthis">Content here which <div>includes</div> other elements etc..) </div> 

vi ritroverete con:

other elements etc..) </div> 

come l'espressione regolare si fermerà al primo </div>. E no, non c'è niente che puoi veramente fare per risolvere questo problema (con espressioni regolari) in modo coerente.

fatto con un parser sembra più simile a questo:

$doc = new DOMDocument(); 
$doc->loadHTML($html); 
$element = $doc->getElementById('ithis'); 
$element->parentNode->removeChild($element); 
$html = $doc->saveHTML(); 
+0

+1. Vale la pena di commentare che (A) Se l'elemento non esiste, allora '$ element' è' NULL' e il comando '-> removeChild()' fallirà con un errore fatale, e (B) si può/vorrebbe usare '@' per causare '-> loadHTML()' per mettere a tacere qualsiasi avviso su HTML non valido: '@ $ doc-> loadHTML ($ html);' –

1

non so su PHP, ma è possibile sostituire /<id.*?<\/id[^>]*>/ con niente.

0

PHP è lato server e l'output proviene dal server. Non puoi semplicemente non emetterlo? O stai cercando di nasconderlo? Se è così, in un foglio di stile, dì semplicemente #ithis {display:none}.

Se la stringa è un ritorno da qualche funzione in PHP che non hai scritto E non vuoi perdere tempo con quel codice, devi scrivere una regex molto difficile per tenere conto delle div nidificate, variando la sintassi in l'output, ecc. Raccomanderei di usare un parser (forse questo Zend Framework component) per aiutarti. L'ho usato un paio di volte per qualcosa di simile. Anche se non hai affatto familiarità con ZF, potresti voler provare qualcos'altro.

Problemi correlati