Hola:
Navengando por el foro me encontre este post y se me hizo interesante al problema. Ví el código final que diste, pero no entiendo muy bien como es que soluciona tu problema, así que decidí tomar unos 10 min. y hacer un pequeño script de prueba.
EL PROBLEMA
Crear un sencillo script que saque a la luz cualquier texto que haya sido oculto poniendolo del mismo color que el fondo de la página.
LA SOLUCIÓN
Lo primero que debemos de pensar, es que se pueden poner de dos manera los colores, por ejemplo el blanco se puede específicar usando #FFFFFF o poniendo simplemente la palabra white.
Hoy en día también se puede poner color a las fuentes usando el atributo de color= del tag font, o usando un style, por ejemplo style="color:white;".
Lo siguiente, es que para poder sacar a la luz el texto oculto, debemos de cambiar el color de la fuente al contrario del fondo, es decir si el fondo es blanco hay que poner el texto en negro, si el fondo es negro entonces lo ponemos en blanco. Con esto en mente, lo primero que vamos a hacer es un hash con la configuración de los colores:
Vamos a crear una nueva llaver por cada color:
Código:
$BGCOLOR{"FFFFFF"} = ["white", "black"];
Por ejemplo, este nuevo elemento de nuestro hash, tiene la siguiente estructura. El nombre de la llave es el número hexadecimal del color, en el valor de la llaver creamos un hash, cuyo primer valor es el nombre del color, es decir FFFFFF=white, y el segundo elemento es el color contrario, es decir el negro es el contrario al blanco.
Podemos hacer una nueva llave para el color negro:
Código:
$BGCOLOR{"000000"} = ["black", "white"];
Es bastante sencillo meter nuevos colores para detectar.
Ahora, vamos a crear nuestra pequeña función que va a realizar todo el trabajo:
Código:
sub detectar_spam{
my $file = shift;
open(FILE,$file);
my $html_string = join "", <FILE>;
close(FILE);
#Sacar el color del fondo
$html_string =~ m/bgcolor=\"?\#?(.*?)\"?\s+/ix;
#Tenemos el color del background
my $bgcolor = uc($1);
#Vemos si existe una llave para el color del fondo
#De lo contrario creamos un default
if(!defined($BGCOLOR{$bgcolor})){
$BGCOLOR{$bgcolor} = ["null", "black"];
}
#Sustituimos el color de las fuentes
#Primero intentamos con color=
$html_string =~ s/\bcolor\="?\#?$bgcolor"?/color\="$BGCOLOR{$bgcolor}[1]"/gix;
$html_string =~ s/\bcolor\="?\#?$BGCOLOR{$bgcolor}[0]"?/color\="$BGCOLOR{$bgcolor}[1]"/gix;
#Ahora vamos con el style color:
$html_string =~ s/color\:\#?$bgcolor/color\:$BGCOLOR{$bgcolor}[1]/gix;
$html_string =~ s/color\:$BGCOLOR{$bgcolor}[0]/color\:$BGCOLOR{$bgcolor}[1]/gix;
#CREAMOS EL NUEVO ARCHIVO
open(HTML,">$file.spam") or die "No se pudo abrir el archivo: $!";
print HTML $html_string;
close(HTML);
}
Es bastante sencilla la función, lo que hace es recibir el nombre de un archivo, lo abre, guarda todo el contenido en un string, saca el color del fondo definido por bgcolor=, checa si tenemos un llave definida por el color del fondo, si no hay una llave definida entonces crea un default a negro y después realizar la sustitución en las fuentes, finalmente creando un nuevo archivo con terminación .spam.
El código final sería como sigue:
Código:
#!/usr/bin/perl -w
use strict;
print "Ingrese el nombre del archivo .html\n";
my $file = <STDIN>;
chomp($file);
my %BGCOLOR;
$BGCOLOR{"FFFFFF"} = ["white", "black"];
$BGCOLOR{"000000"} = ["black", "white"];
#etc... con todos los demás colores
detectar_spam($file);
sub detectar_spam{
my $file = shift;
open(FILE,$file);
my $html_string = join "", <FILE>;
close(FILE);
#Sacar el color del fondo
$html_string =~ m/bgcolor=\"?\#?(.*?)\"?\s+/ix;
#Tenemos el color del background
my $bgcolor = uc($1);
#Vemos si existe una llave para el color del fondo
#De lo contrario creamos un default
if(!defined($BGCOLOR{$bgcolor})){
$BGCOLOR{$bgcolor} = ["null", "black"];
}
#Sustituimos el color de las fuentes
#Primero intentamos con color=
$html_string =~ s/\bcolor\="?\#?$bgcolor"?/color\="$BGCOLOR{$bgcolor}[1]"/gix;
$html_string =~ s/\bcolor\="?\#?$BGCOLOR{$bgcolor}[0]"?/color\="$BGCOLOR{$bgcolor}[1]"/gix;
#Ahora vamos con el style color:
$html_string =~ s/color\:\#?$bgcolor/color\:$BGCOLOR{$bgcolor}[1]/gix;
$html_string =~ s/color\:$BGCOLOR{$bgcolor}[0]/color\:$BGCOLOR{$bgcolor}[1]/gix;
#CREAMOS EL NUEVO ARCHIVO
open(HTML,">$file.spam") or die "No se pudo abrir el archivo: $!";
print HTML $html_string;
close(HTML);
} #sub detectar_spam
Por ejemplo, puedes probar el nuevo script con un html como el que sigue:
Código HTML:
<html>
<head>
<title>Mi HTML con texto oculto</title>
</head>
<body bgcolor="#ffffff" text="#000000" link="#ff00ff" vlink="#ff80c0" alink="#ff0080">
Vamos a ver distintos textos en blanco:
<p>
<font color=#FFFFFF>1 Blanco</font><br>
<font color="#FFFFFF">2 Blanco</font><br>
<font color=FFFFFF>3 Blanco</font><br>
<font color="FFFFFF">4 Blanco</font><br>
<font color="white">5 Blanco</font><br>
<font color=white>6 Blanco</font><br>
<font style="color:#FFFFFF;">7 Blanco</font><br>
<font style="color:FFFFFF;">8 Blanco</font><br>
<font style="color:white;">9 Blanco</font><br>
</body>
</html>
Al correr el script, vas a ver que te genera un nuevo HTML con todas las fuentes en color negro, sin importar que cada línea tiene definido el color blanco de manera distinta.
MEJORAS
Podrías mejorar el script poniendo la posibilidad de que detecte el color del fondo definido con CSS.
También puedes poner la capacidad de convertir los colores de fuentes esctritas de la siguiente manera: "fff", "000", "faf", etc...
---
Bueno, estos son mis dos pequeños centavos.
SALUDOS