Abbina i tag html non chiusi usando regex e php

Sto usando php e regex per trovare tag html non chiusi in una string:

Questa è la mia string:

$s="<div><h2>Hello world<h2><p>It's 7Am where I live<p><div>"; 

Puoi vedere Tutti i tag qui non sono chiusi.

Voglio trovare tutti i tag non chiusi, ma il problema è che la mia regex corrisponde anche ai tag di apertura.

Ecco la mia regex finora

 /<[^>]+>/i 

E questa è la mia function preg_match_all ()

 preg_match_all("/<[^>]+>/i",$s,$v); print_r($v); 

Cosa devo modificare nella mia espressione regolare per abbinare solo i tag non chiusi?

  <h2> <p> <div> 

Potresti non DOMDocument , ma DOMDocument può aiutarti a correggere l'HTML.

 $html = "<div><h2>Hello world<h2><p>It's 7Am where I live<p><div>"; libxml_use_internal_errors(true); $dom = new DOMDocument(); $dom->loadHTML('<root>' . $html . '</root>', LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); $xpath = new DOMXPath($dom); foreach( $xpath->query('//*[not(node())]') as $node ) { $node->parentNode->removeChild($node); } echo substr($dom->saveHTML(), 6, -8); 

Vedi demo IDEONE

Risultato: <div><h2>Hello world</h2><p>It's 7Am where I live</p></div>

Si noti che la pulizia del nodo vuoto basata su XPath è necessaria poiché il DOM contiene <h2></h2> vuoti <h2></h2> , <p></p> e <div></div> dopo aver caricato l'HTML nel DOM.

L'elemento <root> viene aggiunto all'inizio per essere sicuro di get l'elemento root. Più tardi, possiamo post-elaborarlo con substr .

Il file LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD flag LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD sono necessari in modo che nessun DTD e altra spazzatura non siano stati aggiunti al DOM.

Trovare tag ineguagliati sembra fondamentalmente troppo difficile da fare con una regex. Fondamentalmente è necessario mettere each tag di apertura a vedere in una coda e quindi saltarlo fuori dalla coda quando si vede il tag di chiusura.

Consiglia di utilizzare una libreria che esegue la validation HTML. Vedi queste domande:

Rimuovi i tag HTML non corrispondenti in una string

Come trovare il tag div non chiuso

PHP ottiene tutti i tag HTML non chiusi nella string