Comunidad Gambas-es
[SOLUCIONADO] ¿Cómo obtener el texto plano de un «RichText» (HTML)? - Versión para impresión

+- Comunidad Gambas-es (https://gambas-es.org)
+-- Foro: Gambas (https://gambas-es.org/forum-3.html)
+--- Foro: General (https://gambas-es.org/forum-4.html)
+--- Tema: [SOLUCIONADO] ¿Cómo obtener el texto plano de un «RichText» (HTML)? (/thread-1408.html)



¿Cómo obtener el texto plano de un «RichText» (HTML)? - Grandamakulo - 23-06-2023

Pues eso, compañeros, ¿cómo obtener el texto plano de un RichText —HTML—, similar a WebPage.ToString, pero sin cargar este componente? Quiero decir, que si hay alguna función de cadena que mi natural torpeza me haya impedido ver.
De momento, me apaño así —las ReGex las he ido encontrando por ahí y adaptándolas al algo corto PCRE de gambas3—:

Código:
Public Function HTMLaTexto(sTexto As String) As String
  ' **** Obtener texto plano de un RichText (HTML).
  ' <<<< sPaso : Devuelve una cadena con texto plano.
  ' >>>> sTexto: Texto formato HTML.
  '' ╔═════════════════════════════════════════════════════════════╗
  '' ║ Atención: PCRE sólo admite texto ASCII extendido, no UTF-8. ║
  '' ║     Los valores obtenidos pueden no ser correctos.          ║
  '' ╚═════════════════════════════════════════════════════════════╝

  Dim sPaso As String
  
  ' Eliminar CSS y JS
  sPaso = RegExp.Replace(sTexto, "<(script|style)[^>]*>(.*?)<.(script|style)>", "", RegExp.Caseless + RegExp.DotAll)
  ' Eliminar comentarios
  sPaso = RegExp.Replace(sPaso, "<!--.*?-->", "", RegExp.DotAll)
  ' Eliminar etiquetas
  sPaso = RegExp.Replace(sPaso, "<(.|\n)*?>", "", RegExp.Greedy)
  ' Eliminar caracteres de edición antes y después
  sPaso = Trim(sPaso)
  Return sPaso

End

Gracias de antemano.


RE: ¿Cómo obtener el texto plano de un «RichText» (HTML)? - vuott - 23-06-2023

No sé si este código es Confused coherente con lo que pides:
Código:
Public Sub Main()

  Print HTMLaTexto("a<FONT Color=red><B>Abcd-/ef=123</b></font>")

End


Private Function HTMLaTexto(sTexto As String) As String

  Dim s As String

  For i As Integer = 1 To Len(sTexto)
    If Mid(sTexto, i, 1) = "<" Then
      i = InStr(sTexto, ">", i)
      Continue
    Endif
    s &= Mid(sTexto, i, 1)
  Next

  Return s

End



RE: ¿Cómo obtener el texto plano de un «RichText» (HTML)? - Shell - 23-06-2023

Bueno, soy un poco burro a veces.

Existe esta función que no sé si hace lo que te interesa. Smile

Código:
String.FromHTML

Se encuentra en el componente gb.util y hace esta función:
 
Cita:Return the text contents of an HTML string, by removing all markups and entities.

Te adjunto el enlace:

String.FromHTML (gb.util)

A ver si eso ayuda.

Saludos


RE: ¿Cómo obtener el texto plano de un «RichText» (HTML)? - Grandamakulo - 23-06-2023

@Voutt, no, eso sólo quita las etiquetas y, creo, los comentarios, pero JS o CSS lo dejaría como texto.
@Shell, ¡eso es!, no era capaz de encontrarlo.
¡¡Muchísimas gracias a ambos!!


RE: ¿Cómo obtener el texto plano de un «RichText» (HTML)? - vuott - 23-06-2023

Si quieres usar la función ''.FromHTML()", sugerida por 'Shell', sin tener que activar el Componente 'gb.util', puedes copiarla de las fuentes del Componente, escritas en Gambas:

https://gitlab.com/gambas/gambas/-/blob/master/comp/src/gb.util/.src/String.class