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.

Groovy (o Java): Cómo escapar comillas dobles solo dentro del texto interno de HTML, no en atributos.

Estoy usando un motor de renderizado HTML basado en Groovy dentro de un sistema WCM. Ahora tengo el caso de uso de que el usuario ingresa contenido de texto enriquecido dentro de un formulario basado en TinyMCE que se ve así:

<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
   <span style="text-decoration: underline;">
     sed diam nonumy
   </span> eirmod "tempor" invidunt ut labore et...
</p>

Dentro de mi renderizador de Groovy, ahora quiero transmitir este fragmento de HTML al contenido del documento HTML para el procesamiento de JavaScript del cliente.

Lo que necesito hacer es:
– Escapar comillas dobles DENTRO del contenido (ver el token “tempor” arriba), pero no aquellas que encapsulan los valores de los atributos HTML (ver el atributo “text-decoration” arriba).

Si hago esto:

myHTML.replace("\"", """)

En realidad escaparé TODAS las comillas dobles.

¿Alguna sugerencia sobre cómo puedo escapar solo las comillas QUE SE ENCUENTRAN en el texto real?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para escapar solo las comillas dobles dentro del texto real, se pueden utilizar expresiones regulares para identificar el contenido del texto que se encuentra dentro de las etiquetas HTML y excluir los valores de los atributos HTML. Aquí hay un ejemplo de código en Groovy:

    def html = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, <span style="text-decoration: underline;">sed diam nonumy</span> eirmod "tempor" invidunt ut labore et...</p>'
    
    def escapedHtml = html.replaceAll(/>([^<>"]+?)<|"(.*?)"/) { match ->
      if (match.group(1)) { // el grupo de coincidencia 1 es para el contenido del texto
        return match.group(1).replaceAll(/"/, '"')
      } else { // el grupo de coincidencia 2 es para los valores de atributos HTML
        return match.group(2)
      }
    }
    
    println escapedHtml // resultado: <p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, <span style="text-decoration: underline;">sed diam nonumy</span> eirmod "tempor" invidunt ut labore et...
    

    En el código anterior, usamos el método replaceAll() con una expresión regular como primer argumento. El patrón tiene dos alternativas separadas por un carácter de tubería (|). La primera alternativa coincide con el contenido del texto entre las etiquetas HTML utilizando un conjunto de caracteres negados [^<>"] +? que significa coincidir con cualquier carácter que no sea <,> o " e incluir el número mínimo de caracteres necesario para hacer una coincidencia. La segunda alternativa coincide con el valor del atributo HTML encerrado entre comillas dobles usando el patrón " (.*?) ".

    En la función de reemplazo como segundo argumento, usamos un cierre que toma el objeto de coincidencia como parámetro de entrada y devuelve la cadena de reemplazo. Dentro del cierre, verificamos qué grupo de coincidencia se ha emparejado y reemplazamos solo las comillas dobles para el contenido del texto (grupo de coincidencia 1) usando el método replaceAll() con un patrón de expresión regular simple / "/ y devolver el valor de atributo original para los atributos HTML (grupo de coincidencia 2).

    De esta manera, solo escapamos las comillas dobles dentro del contenido del texto y dejamos los valores de los atributos HTML intactos.

Comments are closed.