Función para limpiar páginas web

y programas personales para otros como tu, puede que te corrijan ;)
Responder
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Función para limpiar páginas web

Mensaje por Jonny »

Hola

Aquí os dejo una función que he hecho para una librería que hice hace tiempo y estoy reescribiendo, para dejarla mucho mejor... Más comprensible, fácil de usar ...
(cuando la tenga lista la cuelgo por si alguien quiere usarla).

Pero como hace tiempo que no aporto nada por aquí, os dejo mientras tanto esta función que le puede ir bien a los que trabajen con páginas web directamente: manipulando el código fuente de estas (con _InetGetSource() por ejemplo (creo que es así la función)), para buscar información en estas, etc.

En realidad, esta es una función interna de la UDF de la que hablaba, pero es tan flexible que al final creo que podría ser perfectamente una función de usuario.

Lo que hace, es, eliminar código de una página web. En principio quitar el HTML de una web no sería muy complicado; pero esta función permite eliminar código por lenguajes.

Como sabemos, las páginas web suelen tener HTML, JAVASCRIPT, CSS...
Con esta función, podemos elegir si eliminar del contenido de una web solo código HTML, solo código JAVASCRIPT, código CSS o comentarios HTML. Esto último, lo he hecho independiente del HTML, JAVASCRIPT o CSS, porque su sintaxis es un tanto distinta. Además, la idea del objetivo de la función es, eliminar lo que no necesitemos, y un programa puede tener muchas necesidades distintas.
Puede que un programa necesite eliminar etiquetas HTML pero no el código JAVASCRIPT, eliminar el código JAVASCRIPT pero no las etiquetas HTML...
Y por eso mismo, puestos a darle flexibilidad a la función, y hacer que sirva en el mayor de casos posible, he pensado que podrían hacer falta los comentarios HTML de una página web, pero no las etiquetas HTML o el código JAVASCRIPT :).

Además de todo esto, la función permite eliminar o mantener las cabeceras HTML de una página web si las hubiera. Esto es así, porque puede en algún momento ser útil para algo consultar las cabeceras HTML. Por ejemplo, si a alguien le da por hacer un navegador... :P.

Y por último, la función permite insertar marcadores en el código de la página web que reciba.
Esto puede ser útil, por ejemplo para hacer más rápida la búsqueda de información en el texto que nos devuelve la función.
Si por ejemplo sabemos que hay un encabezado 4 en la página, y después de este se encuentra la información que queremos, no es necesario recorrer todo el texto, con un bucle por ejemplo. Podríamos insertar un marcador antes de "<h4". Por ejemplo "InfoRef" y buscar a partir de "InfoRef" la información que queremos en el texto devuelto por la función (donde aparecerá "InfoRef" como parte del contenido de la web), teniendo así que procesar menos información.

Los marcadores, también pueden ser útiles en los casos en que tengamos como referencia para encontrar cierta información en una página web, una etiqueta HTML, código JAVASCRIPT o comentario HTML, pero queramos eliminar ese contenido. En ese caso, si la referencia era la carga de una imagen por ejemplo, como sabemos que el código HTML que carga esa imagen desaparecerá porque hemos dicho a la función que elimine todo el código HTML, podemos poner un marcador delante de esa etiqueta HTML para mantener la referencia.


¡Casi lo olvido!

:)
También es posible que la función convierta todos los carácteres HTML especiales en carácteres ASCII.

Todas las opciones son independientes unas de otras, por lo que podría usarse la función por ejemplo solo para convertir los carácteres HTML especiales en carácteres ASCII, solo para quitar las cabeceras HTML de una página web, etc.

Os preguntaréis, que "por qué no carga el código de la página web que queremos procesar directamente" en vez de mandárselo como una cadena.
Como he dicho, en principio es una función interna de una UDF, por lo que esa tarea la hace otra función, ese es el motivo. En la UDF habrá una función para obtener el código de una web, también interna en principio, pero perfectamente funcional para el usuario; pero ¡habrá que esperar que la UDF esté lista! :).

Os parecerá que me he pasado documentando el código... Puede ser :). Pero me he acostumbrado a hacerlo así. El mantenimiento a medio o largo plazo es hasta posible :).
Además, en códigos tan liosos como este, prefiero documentarlo todo, para sin tener que pararme a analizar un montón de funciones o condiciones anidadas, saber que hace cualquier parte del código rápidamente :P.

He escrito el código lo más optimizado que se me ha ocurrido (borrando cientos de veces gran parte :)) y con el máximo control de errores, para intentar garantizar al máximo que la función sea ligera y falle si lo hace, lo menos posible.
Aunque, quizá a alguien se le ocurra otra forma más corta de hacerlo...
En cualquier caso, lo que más ocupa es la conversión de carácteres HTML especiales a carácteres ASCII.

Y después del rollo que he soltado :), ahí va la función. Está documentada, pero he preferido explicaros un poco lo que hace y como funciona, por si la documentación no es muy buena ... :).

Está más que testeada, pero ya sabéis, nunca se sabe :P.
Si encontráis algún error decidlo:

Código: Seleccionar todo

 Func _Adsl_WebCodeStrip($ArgDoc, $ArgHtmlStrip=1, $ArgJsStrip=1, $ArgCssStrip=1, $ArgCommStrip=1, $ArgHeadStrip=1, $ArgEspCharMod=1, $ArgMarkIns="", $ArgSubStr="", $ArgStrUpper=0, $ArgNumMarkIns=0)
  #CS

   ----------

   Descripción:
    - Elimina código HTML, JAVASCRIPT, comentarios HTML y convierte carácteres HTML especiales en carácteres ASCII, de una página web.
   Parámetro(s):
    - $ArgDoc: Contenido de una página web.
    - $ArgHtmlStrip: (1) Elimina código HTML:
     - 0=No eliminar.
     - 1=Eliminar.
    - $ArgJsStrip: (1) Elimina código JAVASCRIPT:
     - 0=No eliminar.
     - 1=Eliminar.
    - $ArgCssStrip: (1) Elimina código CSS:
     - 0=No eliminar.
     - 1=Eliminar.
    - $ArgCommStrip: (1) Eliminar comentarios HTML:
     - 0=No eliminar.
     - 1=Eliminar.
    - $ArgHeadStrip: (1) Elimina cabeceras HTML:
     - 0=No eliminar.
     - 1=Eliminar.
    - $ArgEspCharMod: (1) Convierte carácteres HTML especiales en carácteres ASCII:
     - 0=No convertir.
     - 1=Convertir.
    - $ArgMarkIns: ("") Marcador a insertar.
     Si $ArgMarkIns se inserta dentro de un comentario HTML o código JAVASCRIPT y $ArgCommStrip o $ArgJsStrip respectivamente valen "1", $ArgMarkIns se colocará en el lugar del elemento al que pertenece, pero este será eliminado:
      - "" no inserta ningún marcador.
    - $ArgSubStr: ("") Subcadena en $ArgDoc ante la que se insertará $ArgMarkIns.
     Si $ArgMarkIns recibe un valor y este parámetro no recibe ninguno, la función devolverá 0.
     $ArgMarkIns será insertado de forma independiente en la línea anterior al contenido de este parámetro.
     Si el contenido de este parámetro no se encuentra en $ArgDoc, $ArgMarkIns no será insertado.
    - $ArgStrUpper: (0) Caso sensitivo en la búsqueda de $ArgSubStr.
     Si $ArgMarkIns no recibe ningún valor, este parámetro será ignorado:
      - 0=No usar caso sensitivo.
      - 1=Usar caso sensitivo.
    - $ArgNumMarkIns: (0) Cantidad de veces a insertar $ArgMarkIns.
     Si $ArgMarkIns no recibe ningún valor, este parámetro será ignorado.
     Si la cantidad de veces a insertar $ArgMarkIns es mayor que las veces que aparece $ArgSubStr en $ArgDoc, se insertará $ArgMarkIns en $ArgDoc, tantas veces como $ArgSubStr aparezca en esta:
      - 0=Todas las veces que se encuentre $ArgSubStr en $ArgDoc.
   Valor(es) de retorno:
    - OK: $ArgDoc modificada, según la configuración establecida.
    - 0: Ocurrió un error al eliminar código HTML, JAVASCRIPT, comentarios HTML o convertir carácteres HTML especiales en carácteres ASCII.

   ----------

  #CE
   ;Variables locales:
    Local $BuffSTR ;Buffer para almacenar el texto a devolver.
    Local $DivSTR ;Dividir "$ArgDoc" por carácteres @CRLF.
    Local $InJS=0 ;Bandera para la lectura de código JAVASCRIPT.
    Local $InCSS=0 ;Bandera para la lectura de código CSS.
    Local $InCOMM=0 ;Bandera para la lectura de comentarios HTML.
   ;Control de errores:
    If (($ArgDoc=="") Or ($ArgHtmlStrip<>0 And $ArgHtmlStrip<>1) Or ($ArgJsStrip<>0 And $ArgJsStrip<>1) Or ($ArgCssStrip<>0 And $ArgCssStrip<>1) Or ($ArgEspCharMod<>0 And $ArgEspCharMod<>1) Or ($ArgStrUpper<>0 And $ArgStrUpper<>1) Or ($ArgNumMarkIns=="" Or StringIsDigit($ArgNumMarkIns)=0 Or $ArgNumMarkIns<0) Or ($ArgCommStrip<>0 And $ArgCommStrip<>1) Or ($ArgHeadStrip<>0 And $ArgHeadStrip<>1)) Then Return 0 ;Si "$ArgHtmlStrip", "$ArgJsStrip", "$ArgEspCharMod", "$ArgStrUpper", "$ArgNumMarkIns", "$ArgCommStrip" o "$ArgHeadStrip" no reciben un valor esperado - Devuelve código de error (0).
   ;Inserción de marcadores:
    If $ArgMarkIns<>"" Then ;Si "$ArgMarkIns" recibe un valor.
     If $ArgSubStr=="" Then Return 0 ;Si "$ArgSubStr" no recibe ningún valor - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, $ArgSubStr, "&CRLF"&$ArgMarkIns&"&CRLF"&$ArgSubStr, $ArgNumMarkIns, $ArgStrUpper) ;Inserta "$ArgMarkIns" en "$ArgDoc".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al insertar "$ArgMarkIns" en "$ArgDoc" - Devuelve código de error (0).
    EndIf ;End -> Si "$ArgSubStr" recibe un valor.
   ;Conversión de carácteres HTML:
    If $ArgEspCharMod=1 Then ;Convertir carácteres HTML especiales en carácteres ASCII.
     $ArgDoc=StringReplace($ArgDoc, "<", "<", 0, 1) ;Convierte "<" en "<".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "<" en "<" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, ">", ">", 0, 1) ;Convierte ">" en ">".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir ">" en ">" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "&", "&", 0, 1) ;Convierte "&" en "&".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "&" en "&" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, """, """", 0, 1) ;Convierte """ en """.
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir """ en """ - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "Á", "Á", 0, 1) ;Convierte "Á" en "Á".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "Á" en "Á" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "À", "À", 0, 1) ;Convierte "À" en "À".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "À" en "À" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "É", "É", 0, 1) ;Convierte "É" en "É".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "É" en "É" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "È", "È", 0, 1) ;Convierte "È" en "È".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "È" en "È" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "Í", "Í", 0, 1) ;Convierte "Í" en "Í".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "Í" en "Í" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "Ì", "Ì", 0, 1) ;Convierte "Ì" en "Ì".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "Ì" en "Ì" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "Ó", "Ó", 0, 1) ;Convierte "Ó" en "Ó".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "Ó" en "Ó" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "Ò", "Ò", 0, 1) ;Convierte "Ò" en "Ò".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "Ò" en "Ò" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "Ú", "Ú", 0, 1) ;Convierte "Ú" en "Ú".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "Ú" en "Ú" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "Ù", "Ù", 0, 1) ;Convierte "Ù" en "Ù".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "Ù" en "Ù" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "á", "á", 0, 1) ;Convierte "á" en "á".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "á" en "á" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "à", "à", 0, 1) ;Convierte "à" en "à".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "à" en "à" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "é", "é", 0, 1) ;Convierte "é" en "é".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "é" en "é" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "è", "è", 0, 1) ;Convierte "è" en "è".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "è" en "è" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "í", "í", 0, 1) ;Convierte "í" en "í".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "í" en "í" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "ì", "ì", 0, 1) ;Convierte "ì" en "ì".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "ì" en "ì" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "ó", "ó", 0, 1) ;Convierte "ó" en "ó".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "ó" en "ó" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "ò", "ò", 0, 1) ;Convierte "ò" en "ò".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "ò" en "ò" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "ú", "ú", 0, 1) ;Convierte "ú" en "ú".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "ú" en "ú" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "ù", "ù", 0, 1) ;Convierte "ù" en "ù".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "ù" en "ù" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "Ä", "Ä", 0, 1) ;Convierte "Ä" en "Ä".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "Ä" en "Ä" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "Â", "Â", 0, 1) ;Convierte "Â" en "Â".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "Â" en "Â" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "Ë", "Ë", 0, 1) ;Convierte "Ë" en "Ë".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "Ë" en "Ë" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "Ê", "Ê", 0, 1) ;Convierte "Ê" en "Ê".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "Ê" en "Ê" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "Ï", "Ï", 0, 1) ;Convierte "Ï" en "Ï".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "Ï" en "Ï" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "Î", "Î", 0, 1) ;Convierte "Î" en "Î".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "Î" en "Î" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "Ö", "Ö", 0, 1) ;Convierte "Ö" en "Ö".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "Ö" en "Ö" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "Ô", "Ô", 0, 1) ;Convierte "Ô" en "Ô".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "Ô" en "Ô" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "Ü", "Ü", 0, 1) ;Convierte "Ü" en "Ü".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "Ü" en "Ü" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "Û", "Û", 0, 1) ;Convierte "Û" en "Û".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "Û" en "Û" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "ä", "ä", 0, 1) ;Convierte "ä" en "ä".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "ä" en "ä" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "â", "â", 0, 1) ;Convierte "â" en "â".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "â" en "â" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "ë", "ë", 0, 1) ;Convierte "ë" en "ë".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "ë" en "ë" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "ê", "ê", 0, 1) ;Convierte "ê" en "ê".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "ê" en "ê" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "ï", "ï", 0, 1) ;Convierte "ï" en "ï".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "ï" en "ï" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "î", "î", 0, 1) ;Convierte "î" en "î".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "î" en "î" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "ö", "ö", 0, 1) ;Convierte "ö" en "ö".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "ö" en "ö" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "ô", "ô", 0, 1) ;Convierte "ô" en "ô".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "ô" en "ô" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "ü", "ü", 0, 1) ;Convierte "ü" en "ü".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "ü" en "ü" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "û", "û", 0, 1) ;Convierte "û" en "û".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "û" en "û" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "Ã", "Ã", 0, 1) ;Convierte "Ã" en "Ã".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "Ã" en "Ã" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "å", "å", 0, 1) ;Convierte "å" en "å".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "å" en "å" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "Ñ", "Ñ", 0, 1) ;Convierte "Ñ" en "Ñ".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "Ñ" en "Ñ" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "Å", "Å", 0, 1) ;Convierte "Å" en "Å".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "Å" en "Å" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "Õ", "Õ", 0, 1) ;Convierte "Õ" en "Õ".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "Õ" en "Õ" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "Ç", "Ç", 0, 1) ;Convierte "Ç" en "Ç".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "Ç" en "Ç" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "ã", "ã", 0, 1) ;Convierte "ã" en "ã".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "ã" en "ã" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "ç", "ç", 0, 1) ;Convierte "ç" en "ç".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "ç" en "ç" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "ñ", "ñ", 0, 1) ;Convierte "ñ" en "ñ".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "ñ" en "ñ" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "Ý", "Ý", 0, 1) ;Convierte "Ý" en "Ý".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "Ý" en "Ý" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "õ", "õ", 0, 1) ;Convierte "õ" en "õ".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "õ" en "õ" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "ý", "ý", 0, 1) ;Convierte "ý" en "ý".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "ý" en "ý" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "Ø", "Ø", 0, 1) ;Convierte "Ø" en "Ø".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "Ø" en "Ø" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "ÿ", "ÿ", 0, 1) ;Convierte "ÿ" en "ÿ".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "ÿ" en "ÿ" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "ø", "ø", 0, 1) ;Convierte "ø" en "ø".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "ø" en "ø" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "Þ", "Þ", 0, 1) ;Convierte "Þ" en "Þ".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "Þ" en "Þ" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "Ð", "Ð", 0, 1) ;Convierte "Ð" en "Ð".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "Ð" en "Ð" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "þ", "þ", 0, 1) ;Convierte "þ" en "þ".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "þ" en "þ" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "ð", "ð", 0, 1) ;Convierte "ð" en "ð".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "ð" en "ð" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "Æ", "Æ", 0, 1) ;Convierte "Æ" en "Æ".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "Æ" en "Æ" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "ß", "ß", 0, 1) ;Convierte "ß" en "ß".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "ß" en "ß" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "æ", "æ", 0, 1) ;Convierte "æ" en "æ".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "æ" en "æ" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "¼", "¼", 0, 1) ;Convierte "¼" en "¼".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "¼" en "¼" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, " ", Chr(160), 0, 1) ;Convierte " " en Chr(160).
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir " " en Chr(160) - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "½", "½", 0, 1) ;Convierte "½" en "½".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "½" en "½" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "¡", "¡", 0, 1) ;Convierte "¡" en "¡".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "¡" en "¡" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "¾", "¾", 0, 1) ;Convierte "¾" en "¾".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "¾" en "¾" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "£", "£", 0, 1) ;Convierte "£" en "£".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "£" en "£" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "©", "©", 0, 1) ;Convierte "©" en "©".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "©" en "©" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "¥", "¥", 0, 1) ;Convierte "¥" en "¥".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "¥" en "¥" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "®", "®", 0, 1) ;Convierte "®" en "®".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "®" en "®" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "§", "§", 0, 1) ;Convierte "§" en "§".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "§" en "§" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "ª", "ª", 0, 1) ;Convierte "ª" en "ª".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "ª" en "ª" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "¤", "¬", 0, 1) ;Convierte "¤" en "¬".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "¤" en "¬" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "²", "²", 0, 1) ;Convierte "²" en "²".
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "²" en "²" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "¦", "¦", 0, 1) ;Convierte "¦" en "¦", .
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "¦" en "¦" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "³", "³", 0, 1) ;Convierte "³" en "³", .
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "³" en "³" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "«", "«", 0, 1) ;Convierte "«" en "«", .
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "«" en "«" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "¹", "¹", 0, 1) ;Convierte "¹" en "¹", .
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "¹" en "¹" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "¬", "¬", 0, 1) ;Convierte "¬" en "¬", .
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "¬" en "¬" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "¯", "¯", 0, 1) ;Convierte "¯" en "¯", .
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "¯" en "¯" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "­", "­", 0, 1) ;Convierte "­" en "­", .
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "­" en "­" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "µ", "µ", 0, 1) ;Convierte "µ" en "µ", .
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "µ" en "µ" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "º", "º", 0, 1) ;Convierte "º" en "º", .
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "º" en "º" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "¶", "¶", 0, 1) ;Convierte "¶" en "¶", .
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "¶" en "¶" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "´", "´", 0, 1) ;Convierte "´" en "´", .
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "´" en "´" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "·", "·", 0, 1) ;Convierte "·" en "·", .
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "·" en "·" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "¨", "¨", 0, 1) ;Convierte "¨" en "¨", .
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "¨" en "¨" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "°", "°", 0, 1) ;Convierte "°" en "°", .
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "°" en "°" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "±", "±", 0, 1) ;Convierte "±" en "±", .
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "±" en "±" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "¸", "¸", 0, 1) ;Convierte "¸" en "¸", .
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "¸" en "¸" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "»", "»", 0, 1) ;Convierte "»" en "»", .
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "»" en "»" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "¿", "¿", 0, 1) ;Convierte "¿" en "¿", .
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "¿" en "¿" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "×", "×", 0, 1) ;Convierte "×" en "×", .
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "×" en "×" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "¢", "¢", 0, 1) ;Convierte "¢" en "¢", .
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "¢" en "¢" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "÷", "÷", 0, 1) ;Convierte "÷" en "÷", .
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "÷" en "÷" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "€", "€", 0, 1) ;Convierte "€" en "€", .
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "€" en "€" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "&#147;", "“", 0, 1) ;Convierte "&#147;" en "“", .
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "&#147;" en "“" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "&#153;", "™", 0, 1) ;Convierte "&#153;" en "™", .
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "&#153;" en "™" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "&#148;", "”", 0, 1) ;Convierte "&#148;" en "”", .
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "&#148;" en "”" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "&#137;", "‰", 0, 1) ;Convierte "&#137;" en "‰", .
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "&#137;" en "‰" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "&#140;", "Œ", 0, 1) ;Convierte "&#140;" en "Œ", .
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "&#140;" en "Œ" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "&#131;", "ƒ", 0, 1) ;Convierte "&#131;" en "ƒ", .
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "&#131;" en "ƒ" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "&#135;", "‡", 0, 1) ;Convierte "&#135;" en "‡", .
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "&#135;" en "‡" - Devuelve código de error (0).
     $ArgDoc=StringReplace($ArgDoc, "&#134;", "†", 0, 1) ;Convierte "&#134;" en "†", .
      If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al convertir "&#134;" en "†" - Devuelve código de error (0).
    EndIf ;End -> Convertir carácteres HTML especiales en carácteres ASCII.
   ;Tratamiento de cabeceras HTML:
    If $ArgHeadStrip=0 Then ;Conservar cabeceras HTML.
     If StringInStr($ArgDoc, "<!doctype", 0, 1, 1)>1 Then ;Si hay datos antes de la etiqueta "<!doctype".
      $BuffSTR=StringMid($ArgDoc, 1, (StringInStr($ArgDoc, "<!doctype", 0, 1, 1)-1)) ;Extrae las cabeceras HTML.
      $ArgDoc=StringReplace($ArgDoc, StringMid($ArgDoc, 1, (StringInStr($ArgDoc, "<!doctype", 0, 1, 1)-1)), "", 0, 0) ;Elimina las cabeceras HTML.
       If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al eliminar las cabeceras HTML - Devuelve código de error (0).
      ElseIf (StringInStr($ArgDoc, "<!doctype", 0, 1, 1)=0 And StringInStr($ArgDoc, "<html", 0, 1, 1)>1) Then ;Si hay datos antes de la etiqueta "<html" y no existe la etiqueta "<!doctype".
       $BuffSTR=StringMid($ArgDoc, 1, (StringInStr($ArgDoc, "<html", 0, 1, 1)-1)) ;Extrae las cabeceras HTML.
       $ArgDoc=StringReplace($ArgDoc, StringMid($ArgDoc, 1, (StringInStr($ArgDoc, "<html", 0, 1, 1)-1)), "", 0, 0) ;Elimina las cabeceras HTML.
        If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al eliminar las cabeceras HTML - Devuelve código de error (0).
     EndIf ;End -> Si hay datos antes de la etiqueta "<!doctype".
      Else ;No conservar cabeceras HTML.
       If StringInStr($ArgDoc, "<!doctype", 0, 1, 1)>1 Then ;Si hay datos antes de la etiqueta "<!doctype".
        $ArgDoc=StringReplace($ArgDoc, StringMid($ArgDoc, 1, (StringInStr($ArgDoc, "<!doctype", 0, 1, 1)-1)), "", 0, 0) ;Elimina las cabeceras HTML.
         If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al eliminar las cabeceras HTML - Devuelve código de error (0).
        ElseIf StringInStr($ArgDoc, "<html", 0, 1, 1)>1 Then ;Si hay datos antes de la etiqueta "<html".
         $ArgDoc=StringReplace($ArgDoc, StringMid($ArgDoc, 1, (StringInStr($ArgDoc, "<html", 0, 1, 1)-1)), "", 0, 0) ;Elimina las cabeceras HTML.
          If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al eliminar las cabeceras HTML - Devuelve código de error (0).
       EndIf ;End -> Si hay datos antes de la etiqueta "<!doctype".
    EndIf ;End -> Conservar cabeceras HTML.
   ;Preparación de "$ArgDoc" para el procesamiento:
    $ArgDoc=StringReplace($ArgDoc, @Tab, "", 0, 0) ;Elimina todos los carácteres @Tab.
     If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al eliminar todos los carácteres @Tab - Devuelve código de error (0).
    $ArgDoc=StringReplace($ArgDoc, @CRLF, "", 0, 0) ;Elimina todos los carácteres @CRLF.
     If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al eliminar todos los carácteres @CRLF - Devuelve código de error (0).
    $ArgDoc=StringReplace($ArgDoc, @CR, "", 0, 0) ;Elimina todos los carácteres @CR.
     If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al eliminar todos los carácteres @CR - Devuelve código de error (0).
    $ArgDoc=StringReplace($ArgDoc, @LF, "", 0, 0) ;Elimina todos los carácteres @LF.
     If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al eliminar todos los carácteres @LF - Devuelve código de error (0).
    $ArgDoc=StringReplace($ArgDoc, ">", ">"&@CRLF, 0, 0) ;Reemplaza todos los carácteres ">" por ">"&@CRLF.
     If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al reemplazar todos los carácteres ">" por ">"&@CRLF - Devuelve código de error (0).
    $ArgDoc=StringReplace($ArgDoc, "<", @CRLF&"<", 0, 0) ;Reemplaza todos los carácteres "<" por @CRLF&"<".
     If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al reemplazar todos los carácteres "<" por @CRLF&"<" - Devuelve código de error (0).
    $ArgDoc=StringReplace($ArgDoc, "<!--", "<!--"&@CRLF, 0, 0) ;Reemplaza todas las etiquetas de inicio de comentario HTML por "<!--"&@CRLF.
     If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al reemplazar todas las etiquetas de inicio de comentario HTML por "<!--"&@CRLF - Devuelve código de error (0).
    $ArgDoc=StringReplace($ArgDoc, "-->", @CRLF&"-->", 0, 0) ;Reemplaza todas las etiquetas de fin de comentario HTML por @CRLF&"-->".
     If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al reemplazar todas las etiquetas de fin de comentario HTML por @CRLF&"-->" - Devuelve código de error (0).
    $ArgDoc=StringReplace($ArgDoc, @CRLF&@CRLF, @CRLF, 0, 0) ;Reemplaza todos los carácteres @CRLF&@CRLF por @CRLF.
     If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al reemplazar todos los carácteres @CRLF&@CRLF por @CRLF - Devuelve código de error (0).
    $ArgDoc=StringReplace($ArgDoc, "&CRLF", @CRLF, 0, 0) ;Reemplaza todos los carácteres "&CRLF" por carácteres @CRLF.
     If ($ArgDoc=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al reemplazar todos los carácteres "&CRLF" por carácteres @CRLF - Devuelve código de error (0).
   ;Procesamiento de "$ArgDoc":
    $DivSTR=StringSplit($ArgDoc, @CRLF) ;Divide "$ArgDoc" por carácteres @CRLF.
     If (Not IsArray($DivSTR) Or $DivSTR[0]=0) Then Return 0 ;Si ocurrió un error al dividir "$ArgDoc" por carácteres @CRLF - Devuelve código de error (0).
    For $I=1 To $DivSTR[0] Step +1 ;Leer "$ArgDoc" por líneas.
     If ($DivSTR[$I]==@CRLF Or $DivSTR[$I]==@CR Or $DivSTR[$I]==@LF Or $DivSTR[$I]==Chr(160) Or StringIsSpace($DivSTR[$I])=1 Or $DivSTR[$I]=="") Then ContinueLoop ;Si la línea actual contiene solo carácteres @CRLF, @CR, @LF, "Chr(160)", espacios en blanco o no contiene nada - Continúa con la siguiente iteración del bucle.
     If ((StringInStr($DivSTR[$I], "<", 0, 1, 1)<>0 And StringInStr($DivSTR[$I], ">", 0, 1, StringInStr($DivSTR[$I], "<", 0, 1, 1))<>0) And ((StringMid($DivSTR[$I], (StringInStr($DivSTR[$I], "<", 0, 1, 1)+1), 6)<>"script" And StringMid($DivSTR[$I], (StringInStr($DivSTR[$I], "<", 0, 1, 1)+1), 7)<>"/script") And (StringMid($DivSTR[$I], (StringInStr($DivSTR[$I], "<", 0, 1, 1)+1), 5)<>"style" And StringMid($DivSTR[$I], (StringInStr($DivSTR[$I], "<", 0, 1, 1)+1), 6)<>"/style"))) Then ;Si la línea actual contiene código HTML.
      If $ArgHtmlStrip=0 Then ;Copiar la línea actual en el buffer.
       $BuffSTR&=@CRLF&StringStripWS($DivSTR[$I], 1) ;Copia la línea actual en el buffer con un salto de línea delante.
      EndIf ;End -> Copiar la línea actual en el buffer.
      ElseIf StringInStr($DivSTR[$I], "<script", 0, 1, 1)<>0 Then ;Si la línea actual contiene la etiqueta de inicio de código JAVASCRIPT.
       If $ArgJsStrip=0 Then ;Copiar código JAVASCRIPT.
        $BuffSTR&=@CRLF&StringStripWS($DivSTR[$I], 1) ;Copia la línea actual en el buffer con un salto de línea delante.
       EndIf ;End -> Copiar código JAVASCRIPT.
       $InJS=1 ;Activar la bandera de lectura de código JAVASCRIPT.
       ElseIf StringInStr($DivSTR[$I], "</script", 0, 1, 1)<>0 Then ;Si la línea actual contiene la etiqueta de fin de código JAVASCRIPT.
        If $ArgJsStrip=0 Then ;Copiar código JAVASCRIPT.
         $BuffSTR&=@CRLF&StringStripWS($DivSTR[$I], 1) ;Copia la línea actual en el buffer con un salto de línea delante.
        EndIf ;End -> Copiar código JAVASCRIPT.
        $InJS=0 ;Desactivar la bandera de lectura de código JAVASCRIPT.
         ElseIf StringInStr($DivSTR[$I], "<style", 0, 1, 1)<>0 Then ;Si la línea actual contiene la etiqueta de inicio de código CSS.
          If $ArgCssStrip=0 Then ;Copiar código CSS.
           $BuffSTR&=@CRLF&StringStripWS($DivSTR[$I], 1) ;Copia la línea actual en el buffer con un salto de línea delante.
          EndIf ;End -> Copiar código CSS.
          $InCSS=1 ;Activa la bandera de lectura de código CSS.
          ElseIf StringInStr($DivSTR[$I], "</style", 0, 1, 1)<>0 Then ;Si la línea actual contiene la etiqueta de fin de código CSS.
           If $ArgCssStrip=0 Then ;Copiar código CSS.
            $BuffSTR&=@CRLF&StringStripWS($DivSTR[$I], 1) ;Copia la línea actual en el buffer con un salto de línea delante.
           EndIf ;End -> Copiar código CSS.
           $InCSS=0 ;Desactiva la bandera de lectura de código CSS.
           ElseIf StringInStr($DivSTR[$I], "<!--", 0, 1, 1)<>0 Then ;Si la línea actual contiene la etiqueta de inicio de comentario HTML.
            If $ArgCommStrip=0 Then ;Copiar comentario HTML.
             $BuffSTR&=@CRLF&StringStripWS($DivSTR[$I], 1) ;Copia la línea actual en el buffer con un salto de línea delante.
            EndIf ;End -> Copiar comentario HTML.
            $InCOMM=1 ;Activar la bandera de lectura de comentarios HTML.
            ElseIf StringInStr($DivSTR[$I], "-->", 0, 1, 1)<>0 Then ;Si la línea actual contiene la etiqueta de fin de comentario HTML.
             If $ArgCommStrip=0 Then ;Copiar comentario HTML.
              $BuffSTR&=@CRLF&StringStripWS($DivSTR[$I], 1) ;Copia la línea actual en el buffer con un salto de línea delante.
             EndIf ;End -> Copiar comentario HTML.
             $InCOMM=0 ;Desactivar la bandera de lectura de comentarios HTML.
             Else ;Si la línea actual no contiene código HTML, JAVASCRIPT, CSS ni comentarios HTML.
              If $InJS=1 Then ;Si se está leyendo código JAVASCRIPT.
               If $ArgJsStrip=0 Then ;Copiar código JAVASCRIPT en el buffer.
                $BuffSTR&=@CRLF&StringStripWS($DivSTR[$I], 1) ;Copia la línea actual en el buffer con un salto de línea delante.
                Else ;Copiar marcadores en código JAVASCRIPT, en el buffer.
                 If ($ArgMarkIns<>"" And $DivSTR[$I]==$ArgMarkIns) Then ;Si la línea actual es un marcador.
                  $BuffSTR&=@CRLF&StringStripWS($DivSTR[$I], 1) ;Copia la línea actual en el buffer con un salto de línea delante.
                 EndIf ;End -> Si la línea actual es un marcador.
               EndIf ;End -> Copiar código JAVASCRIPT en el buffer.
               ElseIf $InCSS=1 Then ;Si se está leyendo código CSS.
                If $ArgCssStrip=0 Then ;Copiar código CSS en el buffer.
                 $BuffSTR&=@CRLF&StringStripWS($DivSTR[$I], 1) ;Copia la línea actual en el buffer con un salto de línea delante.
                 Else ;Copiar marcadores en código CSS, en el buffer.
                  If ($ArgMarkIns<>"" And $DivSTR[$I]==$ArgMarkIns) Then ;Si la línea actual es un marcador.
                   $BuffSTR&=@CRLF&StringStripWS($DivSTR[$I], 1) ;Copia la línea actual en el buffer con un salto de línea delante.
                  EndIf ;End -> Si la línea actual es un marcador.
                EndIf ;End -> Copiar código CSS en el buffer.
                ElseIf $InCOMM=1 Then ;Si se está leyendo un comentario HTML.
                 If $ArgCommStrip=0 Then ;Copiar comentario HTML en el buffer.
                  $BuffSTR&=@CRLF&StringStripWS($DivSTR[$I], 1) ;Copia la línea actual en el buffer con un salto de línea delante.
                  Else ;Copiar marcadores en comentarios HTML, en el buffer.
                   If ($ArgMarkIns<>"" And $DivSTR[$I]==$ArgMarkIns) Then ;Si la línea actual es un marcador.
                    $BuffSTR&=@CRLF&StringStripWS($DivSTR[$I], 1) ;Copia la línea actual en el buffer con un salto de línea delante.
                   EndIf ;End -> Si la línea actual es un marcador.
                 EndIf ;End -> Copiar comentario HTML en el buffer.
                 ElseIf ($InJS=0 And $InCOMM=0) Then ;Si no se está leyendo código JAVASCRIPT ni comentarios HTML.
                  $BuffSTR&=@CRLF&StringStripWS($DivSTR[$I], 1) ;Copia la línea actual en el buffer con un salto de línea delante.
              EndIf ;End -> Si se está leyendo código JAVASCRIPT.
     EndIf ;End -> Si la línea actual contiene código HTML.
    Next ;End -> Leer "$ArgDoc" por líneas.
    $BuffSTR=StringReplace($BuffSTR, @CRLF&@CRLF, @CRLF, 0, 0) ;Reemplaza todos los carácteres @CRLF&@CRLF por @CRLF.
     If ($BuffSTR=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al reemplazar todos los carácteres @CRLF&@CRLF por @CRLF - Devuelve código de error (0).
    $BuffSTR=StringReplace($BuffSTR, Chr(160), "", 0, 0) ;Elimina todos los carácteres "Chr(160)".
     If ($BuffSTR=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al eliminar todos los carácteres "Chr(160)" - Devuelve código de error (0).
    If (StringMid($BuffSTR, 1, 1)==@CRLF Or StringMid($BuffSTR, 1, 1)==@CR Or StringMid($BuffSTR, 1, 1)==@LF) Then ;Si el primer carácter del buffer es @CRLF, @CR o @LF.
     $BuffSTR=StringReplace($BuffSTR, StringMid($BuffSTR, 1, 1), "", 1, 0) ;Elimina el primer carácter del buffer.
      If ($BuffSTR=="" Or @Error=1) Then Return 0 ;Si ocurrió un error al eliminar el primer carácter del buffer - Devuelve código de error (0).
    EndIf ;End -> Si el primer carácter del buffer es @CRLF, @CR o @LF.
   ;Retorno de ejecución:
    Return $BuffSTR ;Devuelve código de ejecución correcta ($BuffSTR).
 EndFunc
Por cierto: En la documentación de la función no lo he puesto, pero esta devuelve el contenido según la configuración que fijemos con los argumentos que recibe, pero sin formato.
Para facilitar la búsqueda de información en el texto que retorna, elimina todos los espacios en blanco previos a una línea, y todos los carácteres de tabulación, saltos de línea dobles, líneas vacías, que solo contengan espacios, etc etc, devolviendo la información que corresponda por líneas según aparece en la página web. Además, así es más sencillo de programar esta función :) y a la hora de buscar algo en lo que devuelve, basta con hacer un StringSplit($Resultado, @CRLF) por ejemplo para tener el texto dividido por líneas, y recorrerlo fácilmente con un For ... Next.

Salu2!
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Función para limpiar páginas web

Mensaje por Jonny »

He editado el post anterior, porque pensando un poco en CSS (era una pena que la función no lo eliminara) me he dado cuenta de que eliminarlo sería tan sencillo como eliminar código JAVASCRIPT :).
Y efectivamente, si el código CSS está integrado en la página web, se encierra entre etiquetas <style> y </style>. Así, que he filtrado esa parte del contenido que recibe la función en $ArgDoc, y ahora debería filtrar también código CSS de una web si $ArgCssStrip vale 1.

Debería, porque no recuerdo ninguna página que tenga los estilos CSS así escritos, por lo que no lo he probado, tan solo he añadido las mismas condiciones que para JAVASCRIPT pero tratando las etiquetas <style> y </style>.
Lástima, que en la página que he estado haciendo pruebas con esta función los estilos CSS están declarados en archivos externos al documento HTML, como suele hacerse...
Si encontráis algún fallo en el filtrado de CSS decidlo y lo reviso, aunque debería ir bien.

Salu2!
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Función para limpiar páginas web

Mensaje por Chefito »

A ver que tal es esa udf que estás preparando :smt002 .

Como ya te he dicho en alguna ocasión anterior, te recomiendo que pongas un ejemplo de la utilización de la función (o que lo cuelges en un adjunto). Si no, mucha gente no va a probarla.

Puede que te interese hacerlo con expresiones regulares (StringRegExpReplace), ya que como hace poco se demostró (Ximorro), es más rápida que la utilización de las otras funciones string..... . Supongo que también reduciría el código. Depende de lo que te quieras complicar la vida.

http://www.emesn.com/autoitforum/viewto ... ing#p11426
http://www.emesn.com/autoitforum/viewto ... =12&t=2817

Yo hace poco también intenté una función que limpiase totalmente el código de una página web. Quería recuperar solamente el texto que te aparece en el navegador, pero no pude. Me encontré un problema, que si quitaba los códigos script, puede que quitase texto de las páginas, ya que estos código pueden mostrar resultados en la página.

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Función para limpiar páginas web

Mensaje por Jonny »

Cierto que las expresiones deben ser más rápidas y a la hora de programar, requerirá menos código el uso de las expresiones regulares, que con otras funciones String(), pero por más que he mirado las funciones de expresiones regulares de AutoIt, no las entiendo... En php me costó bastante, y llegué a hacer algo con ellas a duras penas, pero en AutoIt no me terminan de entrar.

Buena apreciación la de que puede perderse parte de la información que aparece en el navegador quitando código JAVASCRIPT. Por eso, puede ir bien no eliminarlo, y si se conoce JAVASCRIPT tratarlo. De todas formas, no conozco mucho ese lenguaje, pero creo que muestra texto con algo como Document.write ¿no?. Para rizar el rizo de la función que he puesto, podría además buscarse esa cadena (document.write) o las que sean que impriman texto en JAVASCRIPT, y almacenar el texto que muestran, para devolverlo...

Creo que JAVASCRIPT también puede imprimir texto invocando a scripts externos y cosas así... Una función muy muy muy sofisticada podría comprobar los scripts externos que invoca la etiqueta <script>, buscar la sentencia que imprima texto y devolverlo con el resto de contenido de la página web.

Todo eso tiene que ser cuanto menos entretenido... y meterse en un buen verengenal, pero imagino que "no imposible".
Pero en ese caso, si la página contiene elementos flash, ocurrirá exactamente igual, perderemos información de la página.

De todas formas, php por ejemplo recuerdo que tenía una función para quitar todo el código html de una web (creo que quitaba javascript y css) y era como la que he posteado, no tenía en cuenta el posible texto que generaran los scripts ni flash...

Salu2!
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Función para limpiar páginas web

Mensaje por Ximorro »

Este tipo de análisis es ideal para expresiones regulares, pero si no te aclaras con ellas tampoco hace falta.
Por cierto, suelen ser rápidas para estas cosas, aunque no siempre ganan a StringInStr, a ver si os pongo un análisis. El resumen es que cuando la búsqueda es caso sensitivo StringInStr puede ser más rápido, y en realidad necesario si usamos caracteres Unicode, se supone que la librería de expresiones regulares que usa AutoIT, PCRE, está compilada con soporte Unicode, pero me temo que no funciona.

Respecto a la superlista para cambiar caracteres especiales html, creo que podrías compactarlo a unas pocas líneas usando una matriz bidimensional o dos matrices. Por ejemplo con dos matrices el principio puede ser así:

Código: Seleccionar todo

$aOrig = StringSplit('<,>,&,"', ',', 2)
$aDest = StringSplit('<,>,&,"', ',', 2)
For $i = 0 To Ubound($aOrig)-1
	$ArgDoc = StringReplace($ArgDoc, $aOrig[$i], $aDest[$i], 0, 1)
	If @Error Then Return 0
Next
Eso es equivalente a:

Código: Seleccionar todo

$ArgDoc=StringReplace($ArgDoc, "<", "<", 0, 1)
  If ($ArgDoc=="" Or @Error=1) Then Return 0
 $ArgDoc=StringReplace($ArgDoc, ">", ">", 0, 1)
  If ($ArgDoc=="" Or @Error=1) Then Return 0
 $ArgDoc=StringReplace($ArgDoc, "&", "&", 0, 1)
  If ($ArgDoc=="" Or @Error=1) Then Return 0
 $ArgDoc=StringReplace($ArgDoc, """, """", 0, 1)
  If ($ArgDoc=="" Or @Error=1) Then Return 0
Pero es que para añadir dos más por ejemplo sólo hay que añadir Á,À en un vector y Á,À en el otro y sólo eso ya es equivalente a añadir:

Código: Seleccionar todo

 $ArgDoc=StringReplace($ArgDoc, "Á", "Á", 0, 1)
  If ($ArgDoc=="" Or @Error=1) Then Return 0
 $ArgDoc=StringReplace($ArgDoc, "À", "À", 0, 1)
  If ($ArgDoc=="" Or @Error=1) Then Return 0
Como ves también he simplificado la comprobación del error, pues dice en la ayuda que en error devuelve cadena vacía Y @error a 1, con lo que sólo hace falta comprobar una cosa.

Bastante más corto... esas 218 líneas se pueden quedar en 6... quizás alguna más porque la línea con el vector es muy larga e igual conviene hacerla en varias en el editor, pero vaya, digamos que se queda en 10 líneas y eso para editar cómodamente ;-)
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Función para limpiar páginas web

Mensaje por Ximorro »

A parte de la compresión del comentario anterior, he mirado así rápido a ver si hay algo que se pueda cambiar rápido por expresiones regulares (y suponga una mejora, claro).

A ver qué te parecen estas:
$ArgDoc = StringRegExpReplace($ArgDoc, "[^\S ]", "")
es equivalente a:

Código: Seleccionar todo

$ArgDoc=StringReplace($ArgDoc, @Tab, "", 0, 0)
 If ($ArgDoc=="" Or @Error=1) Then Return 0
$ArgDoc=StringReplace($ArgDoc, @CRLF, "", 0, 0)
 If ($ArgDoc=="" Or @Error=1) Then Return 0
$ArgDoc=StringReplace($ArgDoc, @CR, "", 0, 0)
 If ($ArgDoc=="" Or @Error=1) Then Return 0
$ArgDoc=StringReplace($ArgDoc, @LF, "", 0, 0)
$ArgDoc = StringRegExpReplace($ArgDoc, "(<!--|<)", "$1" & @CRLF)
$ArgDoc = StringRegExpReplace($ArgDoc, "(-->|>)", @CRLF & "$1")

son equivalentes a:

Código: Seleccionar todo

$ArgDoc=StringReplace($ArgDoc, ">", ">"&@CRLF, 0, 0)
 If ($ArgDoc=="" Or @Error=1) Then Return 0
$ArgDoc=StringReplace($ArgDoc, "<", @CRLF&"<", 0, 0)
 If ($ArgDoc=="" Or @Error=1) Then Return 0
$ArgDoc=StringReplace($ArgDoc, "<!--", "<!--"&@CRLF, 0, 0)
 If ($ArgDoc=="" Or @Error=1) Then Return 0
$ArgDoc=StringReplace($ArgDoc, "-->", @CRLF&"-->", 0, 0)
 If ($ArgDoc=="" Or @Error=1) Then Return 0
Con StringRegExpReplace no hay que mirar el error, pues esta función da error sólo si el patrón no es una expresión regular correcta. Así que el error sólo hace falta mirarlo en desarrollo (para asegurarte de que estás poniendo bien el "churro") o si dicha expresión es variable y no se sabe en tiempo de compilación.

Además si con
$ArgDoc=StringReplace($ArgDoc, @CRLF&@CRLF, @CRLF, 0, 0)
sólo intentas cambiar pares de retornos por uno solo pues quizás ya vale así, pero por si te sirve, esta con ER:
$ArgDoc = StringRegExpReplace($ArgDoc, "(\r\n)+", @CRLF)
Cambia cualquier grupo de dos o más retornos de carro por uno solo, da igual que haya dos seguidos o 20. No es lo mismo, la tuya sólo cambia pares, para hacer lo mismo tendrías que ejecutarlo varias veces hasta que no queden más pares.
Si tu intención es cambiar sólo pares (de tal manera que 3 ó 4 retornos de carro seguidos quedarán como dos) no te sirve la ER, pero si los 3 ó 4 quieres que queden como uno pues te será útil.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Función para limpiar páginas web

Mensaje por Jonny »

Jum... Cierto. La verdad es, que me puse a reemplazar los carácteres HTML especiales de la forma más sencilla, que era esa, pero es muy largo.

Las expresiones regulares irían muy bien para varias cosas que hace la función, por ejemplo lo que has apuntado de los retornos de línea consecutivos. Efectivamente, la idea era que tanto si habían dos como cien, quedara sólo uno. Tal como está, así pensando un poco por en cima, en la mayoría de casos si no en todos, debería acabar quedando un único @CRLF, y en cualquier caso con la primera condición del For ... next en lo que devuelva la función no habrá ningún @CRLF doble o con más consecutivos, pero con la expresión regular que pones (que no entiendo) es mucho más sencillo.

Creo que los patrones de las expresiones regulares son iguales en autoit que en php, C++... ¿?.

Lo que no entiendo bien es la documentación de AutoIt de las funciones de expresiones regulares, pero si la forma de buscar coincidencias (los carácteres que se usan) son iguales que en otros lenguajes, quizá con documentación de otros lenguajes me entere mejor...

Buen análisis en general.
He intentado tirar al máximo de StringInstr() porque creí que siempre sería más rápido que usar bucles, que salvo el que uso para recorrer $ArgDoc por líneas he podido evitar.

Salu2!
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Función para limpiar páginas web

Mensaje por Ximorro »

Si quieres quitar agrupaciones de retornos de carro y dejar sólo uno entonces tienes que usar la expresión regular. Quitando pares con StringReplace tienes que ejecutarlo muchas veces hasta que te asegures que no quedan más pares.
Por ejemplo si hay 5 seguidos la primera pasada te deja 3, si R es retorno de carro, "RRRRR" lo agrupa en "(RR)(RR)R" y deja "RRR", entonces hay que hacer otra pasada que agrupa "(RR)R" y deja "RR", en la tercera pasada ya cambia "RR" por "R" para dejar uno.
La expresión regular lo hace todo a una, significa "cualquier aparición de uno o más retornos de carro me lo sustituyes por solo uno"

AutoIt usa PCRE como librería gestora de expresiones regulares, así que hay que buscar la documentación de PCRE más que la del lenguaje, y sí, es la misma que PHP, pero no veo por qué iba a ser más fácil verlo en otros lenguajes.

De hecho AutoIT es mucho más cómodo que otros lenguajes porque no tiene que caracteres especiales en sus cadenas y no hay que escaparlas (a menos que dentro de la cadena uses las mismas comillas que usas para especificarla, pero se puede cambiar. Por ejemplo si tienes "cadena ""con"" comillas", haces 'cadena "con" comillas' y ya está.

Pero en otros lenguajes típicamente la barra invertida es especial, así que hay que escaparla y ponerla dos veces, pero resulta que esa barra también es especial en expresiones regulares, así que también hay que escaparla para la expresión regular. Por ejemplo para poner el literal "c:\windows" en una expresión regular en AutoIt hay que poner "c:\\windows" porque lo requiere la expresión regular, pero es que en cadenas tipo C, que usan muchos lenguajes, precisamente como PHP, habría que escribir "c:\\\\windows", porque hay que volverlo a escapar para el lenguaje. Así que para probar prefiero AutoIT, ya es bastante complicado entender algunas ER como para tener centenares de barras por medio... ;-)

Otro ejemplo chulo que me he encontrado:
Lo que en AutoIt es '"[^"\\\r\n]*(?:\\.[^"\\\r\n]*)*"', en C es "\"[^\"\\\\\\r\\n]*(?:\\\\.[^\"\\\\\\r\\n]*)*\"" ¡casi nada! Si ya se entendía la primera imagínate la segunda.
Eso de antes es "una cadena de una línea que puede estar entrecomillada si se usa escape con barra invertida". Y no, no es que yo la entienda, pero si tengo que estudiarla cogeré la versión AutoIt antes que la segunda, os lo aseguro...

Para la ayuda de PCRE yo he usado la de AutoIt, y esta página que enlazan desde la misma, mucho más completa, pero en inglés:
http://www.autoitscript.com/autoit3/pcrepattern.html

Y bueno, sí, normalmente los diferentes motores de expresiones regulares tienen muchas similitudes, pero también algunas diferencias, puedes aprender en .NET, Java, etc. son diferentes a PCRE pero parecidas, todas derivan de la herramienta grep de Unix, que popularizó esto de las expresiones regulares.

Aquí hay un tutorial que no está mal... en inglés:
http://www.regular-expressions.info/tutorial.html
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Función para limpiar páginas web

Mensaje por Jonny »

PCRE... No me sonaba de nada...

El problema no es tanto AutoIt, seguro que como casi todo, las expresiones regulares también son más sencillas en este que en C o PHP, etc. La cosa es la documentación, es lo que no me termina de entrar.
Por ejemplo, en la función StringExpReplace() pone:
Comentarios

Para separar referencias previas (reemplazar) desde números actuales, agrúpalos con corchetes, ejemplo: "${1}5".
Con eso me quedo igual :).

Y bueno, veo que en StringRegExp() está más explicado como funcionan las expresiones regulares en AutoIt, pero hay cosas que no entiendo. Por ejemplo:
[^ ... ] Coincide cualquier carácter no en el set. Eje. [^0-9] coincide con cualquier no-dígito. Para incluir un caret (^) en un set, ponerlo después de empezar
Ya lo dije alguna vez por aquí, yo soy de los de documentación extensa :).

Salu2!
jamaro
Hacker del Foro
Mensajes: 253
Registrado: 03 Nov 2010, 23:04

Re: Función para limpiar páginas web

Mensaje por jamaro »

Hola:

Cuando he tenido que utilizar las expresiones regulares he consultado en enlace que pone Ximorro más arriba, y además, las miles de pruebas (porque nunca llego a la expresión deseada a la primera) las hago (y no sé si me haré pesado porque ya lo he puesto en otros hilos en los que se habla de Expresiones Regulares) con el GUI que publicaron en el foro inglés, el cuál permite hacer pruebas tanto con un texto copiado/pegado (con extensión limitada) como directamente con un archivo.

Por cierto, las Expresiones Regulares me parecen una herramienta muy potente y quizás poco utilizada.
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Función para limpiar páginas web

Mensaje por Ximorro »

@jamaro
Lástima ese enlace que pones no lo puedo probar, suelo usar AutoIT 3.3.0 y ahí no va. Además dice en el foro que sólo se puede usar ¡SI NO ESTÁ COMPILADO! ¿eso es estrictamente cierto? Yo necesito utilizar un tester compilado porque si uso estas cosas en AutoIT, como estoy desarrollando otro programa, si tendo al Scite ejecutando el tester no puedo ejecutar mi programa para probarlo...

Yo uso este otro, va en 3.3 y por ahora me ha sido suficiente.
SRETesterV2.1.au3

Editado: Ya he conseguido compilar el que pones... ¿para qué versión es? Tiene un opt("RunErrorsFatal", 0) que no es reconocido ni por la versión 3.3.0 ni por la 3.6.1, ¿es para alguna beta?
Además no ejecuta tal como está, le faltan includes (EditConstants.au3 y WindowsConstants.au3, por si alguien quiere probarlo). Sigo prefiriendo el que te he enlazado antes.

@Jonny
Es que en StringRegExpReplace no hay ayuda sobre expresiones regulares, desde esa función te manda a StringRegExp para eso.
Lo del ${1}5 te lo está explicando para la cadena de sustitución (el tercer parámetro), no para la expresión regular (el segundo parámetro).
La cadena de sustitución NO es una expresión regular. Sí tiene cosas raras porque desde ellas puedes hacer referencia a los resultados del match de la expresión regular, a los grupos capturados.

En StringRegExp sí está la ayuda de la sintaxis de expresiones regulares (que a partir de ahora voy a llamar ER para abreviar), aunque simplificada, para ver la ayuda más completa hay que ir al enlace que pone en esa entrada.

Lo del conjunto... pues que si [0-9] indica un carácter que es un dígito, con el "^" haces la negación del conjunto, con lo que [^0-9] significa un carácter que NO es un dígito.
Y que como "^" es un carácter especial dentro del conjunto, si quieres incluirlo en el conjunto como carácter normal, que no lo pongas el primero (donde significa "negación"), por ejemplo [´`^] es "un carácter que representa un acento agudo, grave o circunflejo", pero si haces [^´`] como al principio significa el conjunto contrario, estás poniendo "un carácter que no sea ni el acento agudo ni el acento grave".

Hum, la verdad es que la ayuda en español no la uso mucho, pero ahora mirando eso que me has puesto veo algunos errores, la segunda frase del texto que pones:
Para incluir un caret (^) en un set, ponerlo después de empezar de establecer o escaparlo (\^).
Viene del inglés:
To include a caret (^) in a set, put it after the beginning of the set or escape it (\^).
Pero "after the beginning of the set" significa "después del principio del conjunto", no "después de empezar de establecer", lo que no tiene mucho sentido.

Más abajo veo una frase traducida literalmente del inglés pero en castellano queda cortada:
[^:class:] Coincide con cualquier carácter no en la clase, pero solamente si el primer caracter.
Hay que decir "pero solamente si es el primer carácter.", que se entiende mejor ;-) (por cierto, que carácter en castellano lleva acento, se lo han dejado unas cuantas veces).
Por favor, los que uséis la ayuda en castellano y detectéis errores podíais ir indicándolo a los traductores, para que lo vayan depurando y quede superbien.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Responder