es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Expresión regular para coincidir con cualquier cosa excepto las etiquetas HTML cuando el código está codificado usando < y >

Estoy intentando utilizar regex para hacer coincidir cualquier texto excepto por las etiquetas HTML. He encontrado esta solución para código HTML “normal”:

     

<[^>]*>(*SKIP)(*F)|[^<]+

Sin embargo, mi código está codificado usando &lt; y &gt; en lugar de < y >, y no he podido modificar el regex anterior para que funcione.

Como ejemplo, dado el texto:

     

Hi &lt;p class=\"hello\"&gt;\r\nthere, how are you\r\n&lt;/p&gt;

Necesito hacer coincidir “hi” y “there, how are you”. Tenga en cuenta que también necesito hacer coincidir el texto que no está entre etiquetas, “hi” en este ejemplo.

ACTUALIZACIÓN: como estoy usando el gsub de ruby, parece que incluso no puedo usar *SKIP y *F.

ACTUALIZACIÓN 2: Estaba intentando no entrar en muchos detalles, pero parece ser importante:
En realidad, necesito reemplazar todos los espacios de un texto, pero no aquellos espacios que forman parte de una etiqueta, ya sea una etiqueta &lt; ... &gt; o una etiqueta <...>.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una posible solución para emparejar cualquier texto excepto las etiquetas HTML codificadas con &lt; y &gt; podría ser:

    text = "Hola <p class=\"hello\">\r\n¿cómo estás?\r\n</p>"
    
    # reemplazar < por < y > por >
    text.gsub!("<", "<").gsub!(">", ">")
    
    # emparejar cualquier texto excepto las etiquetas HTML
    text.gsub!(/<[^>]*>(*SKIP)(*F)|\s+/, ' ')
    
    puts text
    # "Hola ¿cómo estás?"
    

    El primer paso es reemplazar &lt; por < y &gt; por > utilizando el método gsub!. Luego, se utiliza la expresión regular /<[^>]*>(*SKIP)(*F)|\s+/ para emparejar cualquier texto excepto las etiquetas HTML. Esta expresión regular utiliza la misma técnica que la solución original, pero en lugar de emparejar etiquetas <...>, las omite utilizando (*SKIP)(*F) y empareja cualquier carácter de espacio en blanco \s+. Por último, los espacios emparejados se reemplazan por un solo espacio utilizando el método gsub!.

    Tenga en cuenta que el uso de (*SKIP)(*F) no es posible con gsub en Ruby, pero se puede lograr utilizando un grupo de captura y un reemplazo condicional con $1 y $2:

    text.gsub!(/(<[^>]*>)|(\s+)/) { $1 || ' ' } # mismo resultado que arriba
    

Comments are closed.