Coincide con las etiquetas HTML no cerradas usando REGEX y PHP -- php campo con regex camp Relacionados El problema

Match unclosed html tags using regex and php


6
vote

problema

Español

Estoy usando PHP y REGEX para encontrar etiquetas HTML no cerradas en una cadena:

Esta es mi cadena:

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

Puedes ver todas las etiquetas aquí no están cerradas.

Quiero encontrar todas las etiquetas no cerradas, pero el problema es que mi regex también está coincidiendo con las etiquetas de apertura también.

Aquí está mi regex hasta ahora

  /<[^>]+>/i   

y esta es mi función preg_match_all ()

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

¿Qué necesito para cambiar en mi regex para que coincida con solo las etiquetas no cerradas?

   <h2>  <p>  <div>   
Original en ingles

I am using php and regex to find unclosed html tags in a string :

This is my string :

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

You can see All tags here are not closed.

I want to find all unclosed tags, but the problem is that my regex is matching opening tags also.

Here is my regex so far

/<[^>]+>/i 

And this is my preg_match_all() function

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

What do I need to change in my regex to match only the unclosed tags?

 <h2>  <p>  <div> 
     
       
       

Lista de respuestas

13
 
vote
vote
La mejor respuesta
 

Es posible que no sepa esto, pero DOMDocument puede ayudarlo a arreglar el 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);   

ver Ideone Demo

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

Tenga en cuenta que la limpieza de nodos vacía basada en XPath es necesaria, ya que el DOM contiene <root>3 , <p></p> <div></div> Etiquetas después de cargar HTML en Dom.

El elemento <root>6 se agrega al principio para asegurarse de que obtenga el elemento raíz bien. Más tarde, podemos post-procesarlo con substr .

Los indicadores LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD son necesarios para que no se agreguen DTD y otra basura a la DOM.

 

You might be unaware of this, but DOMDocument can help you fix the 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); 

See IDEONE demo

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

Note that the XPath-based empty node cleanup is necessary as the DOM contains empty <h2></h2>, <p></p> and <div></div> tags after loading HTML into DOM.

The <root> element is added in the beginning to make sure we get the root element alright. Later, we can post-process it with substr.

The LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD flags are necessary so that no DTD and other rubbish were not added to the DOM.

 
 
   
   
2
 
vote

Encontrar las etiquetas inigualables parece fundamentalmente demasiado difícil de hacer con una regla. Básicamente, necesitas colocar cada etiqueta de apertura en una cola y luego apartarlo de la cola cuando vea la etiqueta de cierre.

Recomiendo que use una biblioteca que realice la validación HTML. Vea estas preguntas:

Eliminar las etiquetas HTML inigualadas en una cadena

Cómo encontrar la etiqueta DIV no cerrada

PHP Obtenga todas las etiquetas HTML no cerradas en la cadena < / p>

 

Finding unmatched tags seems fundamentally too hard to do with a regex. You basically need to put each opening tag to you see onto a queue and then pop it off of the queue when you see the closing tag.

Recommend you use a library that does HTML validation. See these questions:

Remove unmatched HTML tags in a string

How to find the unclosed div tag

PHP get all unclosed HTML tags in string

 
 

Relacionados problema

30  ¿Soporte de expresión regular fácil de usar en C ++? [cerrado]  ( Easy to use regular expression support in c ) 
cerrado. Esta pregunta no cumple con pautas de desbordamiento de pila . Actualmente no está aceptando respuestas. ...

5  DFA -> Expresión regular  ( Dfa regular expression ) 
He escrito un DFA en papel y quiero traducirlo en un conjunto de expresiones regulares. ¿Alguien sabe una buena herramienta para hacer esto? ...

11  ¿Regex para las estructuras de los árboles?  ( Regex for tree structures ) 
¿Hay equivalentes de expresión regulares para buscar y modificar estructuras de árboles? Mini-idiomas concisos (como PERL REGEX) son lo que estoy buscando. ...

2  Quiero encontrar todas las declaraciones de IF en el código C # que no son seguidas de los soportes. A través de regex  ( I want to find all if statements in c sharp code which are not followed by brack ) 
Quiero encontrar todos los estados de cuenta if for que no se siguen por los soportes rizados { '. Cuando escriba una sola línea en una extracción de if...

49  Regex: para sacar una subcadena entre dos etiquetas en una cadena  ( Regex to pull out a sub string between two tags in a string ) 
Tengo un archivo en el siguiente formato: Datos de datos Datos [Comienzo] Datos que quiero [Final] Datos Me gustaría agarrar el Data I want de entre el ...

59  ¿Cómo puedo obtener en los partidos al usar PREG_REPLOPLO EN PHP?  ( How can i get at the matches when using preg replace in php ) 
Estoy tratando de tomar las letras mayúsculas de un par de palabras y envolverlos en las etiquetas de span. Estoy usando preg_replace para propósitos de ext...

2  Regex para encontrar instancia de una palabra o frase, excepto si esa palabra o frase está en llaves  ( Regex to find instance of a word or phrase except if that word or phrase is i ) 
primero, un descargo de responsabilidad. Sé un poco sobre los de Regex's pero no soy experto. Parecen ser algo que realmente necesito dos veces al año, así qu...

1  excluyendo los caracteres coincidentes en la expresión regular  ( Excluding matching characters in regular expression ) 
Estoy atascado con un problema de expresión regular. Tengo una cadena que necesito hacer coincidir. La cadena siempre comienza con 2 letras y luego le sigue...

1  Perl: Extraer datos del texto usando REGEX  ( Perl extracting data from text using regex ) 
Estoy usando PERL para procesar el texto con REGEX. No tengo control sobre la entrada. He mostrado algunos ejemplos de la entrada a continuación. Como puede...

6  ¿Posible recuperar un conjunto arbitrario desordenado de grupos nombrados en un swoop con el módulo RE de Python?  ( Possible to retrieve an arbitrary unordered set of named groups in one swoop wit ) 
Esto es súper útil para algunos problemas: >>> re.search('(?P<b>.b.).*(?P<i>.i.)', 'abcdefghijk').groupdict() {'i': 'hij', 'b': 'abc'} ¿Pero qué pasa s...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos