Comunidad de diseño web y desarrollo en internet online

php - Regexp 1337, recursión

Citar            
MensajeEscrito el 03 Dic 2007 01:52 am
hola
desde hace tiempo he querido realizar un clon de este sitio: http://www.sp34k1337.com/ que en el momento que estoy escribiendo esto no funciona, pero básicamente es un traductor l33t de sitios web.
lo que hace es hacer reemplazos de, por ejemplo, la letra a por un 4, la e por un 3 y letras que se parezcan a números pero sin afectar las etiquetas.
es decir, el siguiente texto plano

Código :

hola, como estan?

lo reemplazaria por:

Código :

h014, c0m0 3574n?


pero si se encuentra tags, las deja intactas:

Código :

<a href="http://www.cristalab.com/">este es cristalab</a>

reemplazado:

Código :

<a href="http://www.cristalab.com/">3573 35 cr157414b</a>


maikel me ha proporcionado un pedazo de código que funciona bastante bien, pero no es recursivo, si un <b> está dentro de un <p> todo se jode. este es el código:

Código :

<?php
//a href="test">este es texto leet</a>
//<a href="test">3573 35 73x70 1337</a>
$text = '<a href="test">este es texto leet</a';
function leetFunction( $match)
{
$chars = array("s","e","l","t", "o");
$leetChars = array("5","3","1","7", "0");
return $match[1] . str_replace($chars, $leetChars, $match[2]) .$match[3];
}
echo "<b>Texto original:</b> <br /> $text";
echo "<br /><b>Texto leet:</b> <br />";
echo preg_replace_callback("/(<.*>)?(.*?)(<\/.*>?)/", "leetFunction", $text);
?>

alguien me podría echar una mano con esto, o alguna referencia a algún tutorial de regexp avanzado?

gracias

Por fael

BOFH

2443 de clabLevel

3 tutoriales
2 articulos

 

firefox
Citar            
MensajeEscrito el 03 Dic 2007 08:19 pm
hola man, prueba esto:

Código :

<?php
header("Content-type: text/plain;");
$text = '<div><b><a href="test">este es texto leet</a></b></div><a href="test">También esto es</a>';
function leetFunction( $match)
{
   global $MyEREG;
   $chars = array("s","e","é","l","t", "o");
   $leetChars = array("5","3","3","1","7", "0");
   return $match[1] . str_replace($chars, $leetChars, $match[2]) .$match[3];
}
$MyEREG = "/(<[^<>]*>)([^<>]*)(<\/[^<>]*>)/";
echo $text . "\n\n";
echo preg_replace_callback($MyEREG, "leetFunction", $text);
?>


Saludos

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 03 Dic 2007 08:49 pm
Una pregunta, para que sirve eso?
Estube buscando, pero no encontra informacion.-

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie
Citar            
MensajeEscrito el 03 Dic 2007 09:34 pm

Código :

<?php
header("Content-type: text/plain;");
$text = '<div>este es texto<b><a href="test">este es texto leet</a></b> este es texto</div><a href="test">También esto es</a>';
function leetFunction( $match)
{
   $chars = array("s","e","é","l","t", "o");
   $leetChars = array("5","3","3","1","7", "0");
   preg_match_all("/([^<>]*)/", $match[2],$TargetNews);
   $newText = str_replace($chars, $leetChars, $match[2]);
   return $match[1] . $newText .$match[3];
}
$MyEREG = "/(<[^<>]*>)([^<>]*)(<[^<>]*>)/";
echo $text . "\n\n";
echo preg_replace_callback($MyEREG, "leetFunction", $text);
?>

Mejorado el code...

york3rs el código sirve para remplazar texto en su representación Leet, mas info:
http://en.wikipedia.org/wiki/Leet


Saludos

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 04 Dic 2007 03:19 am
HOLY SHIT

wow, gracias dano, sos mi héroe

Por fael

BOFH

2443 de clabLevel

3 tutoriales
2 articulos

 

firefox
Citar            
MensajeEscrito el 06 Dic 2007 03:17 am
puff, no quisiera pedir mucho, pero el script no funciona al 100%, sobre todo con el texto que no está dentro de tags.

Código :

<?php
header("Content-type: text/plain;");
$text = 'este texto no se reemplaza <div>este es texto<b><a href="test">este es texto leet</a></b> este es texto</div><a href="test">También esto es</a> este tampoco';
function leetFunction( $match)
{
   $chars = array("s","e","é","l","t", "o");
   $leetChars = array("5","3","3","1","7", "0");
   preg_match_all("/([^<>]*)/", $match[2],$TargetNews);
   $newText = str_replace($chars, $leetChars, $match[2]);
   return $match[1] . $newText .$match[3];
}
$MyEREG = "/(<[^<>]*>)([^<>]*)(<[^<>]*>)/";
echo $text . "\n\n";
echo preg_replace_callback($MyEREG, "leetFunction", $text);
?>


ya intenté moverle, pero npi, esto es demasiado avanzado para mi.

mil gracias otra vez.

Por fael

BOFH

2443 de clabLevel

3 tutoriales
2 articulos

 

firefox
Citar            
MensajeEscrito el 06 Dic 2007 04:05 am
Prueba asi:

Código :

<?php
header("Content-type: text/plain;");
$text = 'este texto no se reemplaza <div>este es texto<b><a href="test">este es texto leet</a></b> este es texto</div><a href="test">También esto es</a> este tampoco';
function leetFunction( $match)
{
   $chars = array("s","e","é","l","t", "o", "a");
   $leetChars = array("5","3","3","1","7", "0","4");

   preg_match_all("/([^<>]*)/", $match[2],$TargetNews);
   $newText = str_replace($chars, $leetChars, $match[2]);
   return $match[1] . $newText .$match[3];

   
}

$MyEREG = "/(<[^<>]*>|)([^<>]*)(<[^<>]*>|)/";
echo $text . "\n\n";
echo preg_replace_callback($MyEREG, "leetFunction", $text);
?>

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 06 Dic 2007 06:00 am
A-M-A-Z-I-N-G
gracias bro, sos mi héroe!

Por fael

BOFH

2443 de clabLevel

3 tutoriales
2 articulos

 

firefox
Citar            
MensajeEscrito el 11 Dic 2007 07:54 pm
uff, disculpen la insistencia pero sigo teniendo problemas. y es que el html a pasar a l33t es muy variado, en algunas partes los acentos están así nomás y en otras partes son entidades de html, además de las otras entidades, es decir:

Código :

&nbsp; hola se&ntilde;ores, cómo están?

se reemplazaría así:

Código :

&n85p; h0l4 53&n71ld3;0r35, c0m0 3574n?


discutiendo con maik, la posible solución sería convertir todas las entidades a "caracteres normales", realizar el reemplazo y volver a convertirlas, pero hay un par de inconvenientes: el primero es que ese &nbsp; se perdería (que igual no es muy grave), pero el segundo es que en local el traspaso de entidades lo hace bien, pero en el servidor no y no tengo idea de porqué sucede esto.

thank you

Por fael

BOFH

2443 de clabLevel

3 tutoriales
2 articulos

 

firefox
Citar            
MensajeEscrito el 13 Dic 2007 07:38 am
Me parece que la función html_entity_decode() puede servir para transformar por ejemplo &ntilde; a "ñ" antes de procesar el texto como ha puesto Maikel.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 13 Dic 2007 09:45 pm
como lo especifiqué líneas arriba, hay dos problemas con entity_decode, así que no creo que sea la solución

Por fael

BOFH

2443 de clabLevel

3 tutoriales
2 articulos

 

firefox
Citar            
MensajeEscrito el 13 Dic 2007 11:18 pm
El problema por el que tu servidor remplaza mal los entities es por el charset default de apache, para resolver eso htmlentities acepta como parametro opcional el charset. Pero bueno eso ya no es necesario, el código que te paso abajo corrige el problema de los entities sin hacer la conversión y "desconversión" de entidades.

Código :

<?php
header("Content-type: text/plain;");
$text = 'este texto no se reemplaza <div>este es texto Viva M&eacute;xico<b><a href="test">este es M&eacute;xico texto leet</a></b> este es M&eacute;xico texto</div><a href="test">También esto M&eacute;xico M&eacute;xico es</a> este tampoco';
function godFunction($match)
{
   $chars = array("s","e","é","l","t", "o", "a");
   $leetChars = array("5","3","3","1","7", "0","4");
   $newText = str_replace($chars, $leetChars, $match[1]);
   return $newText . $match[2];
}
function leetFunction($match)
{
   $newText = preg_replace_callback("/([^&.*;]*)(&.*;|)/", "godFunction", $match[2]);
   return $match[1] . $newText .$match[3];

   
}

$MyEREG = "/(<[^<>]*>|)([^<>]*)(<[^<>]*>|)/";
echo $text . "\n\n";
echo preg_replace_callback($MyEREG, "leetFunction", $text);
?>

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.