Ver Mensaje Individual
  #4 (permalink)  
Antiguo 16/07/2007, 05:55
clinisbut
 
Fecha de Ingreso: diciembre-2004
Mensajes: 278
Antigüedad: 19 años, 4 meses
Puntos: 0
Re: Enlaces y expresiones regulares

Después de que se me iluminara la bombilla con http://www.forosdelweb.com/f18/bbcode-citar-mensaje-con-cita-375546/, se me ha ocurrido como zanjar este tema.
Para quien le surja la misma duda o para quien se lo quiera mirar para encontrar posibles vulnerabilidades:
Código PHP:
preg_match_all('/\[LINK\](?:http:\/\/)?([a-zA-Z0-9_\?=;\.\/\&#:]+)\[\/LINK\]/'$texto$coincidenciasPREG_SET_ORDER );        
        
    foreach( 
$coincidencias AS $coincidencia )
    {
        
$cadena $coincidencia[0];
        if( !
preg_match"/javascript:/i"$cadena ) )
        {    
$reemplazo "<a href=\"\\1\" />\\1";
        }
        else
        {    
$reemplazo "";
        }
        
$cadena str_replace'/''\/'$cadena );
        
$cadena str_replace'.''\.'$cadena );
        
$patron "/\[LINK\](".substr$cadena5strlen$cadena )-12 ).")\[\/LINK\]/";
        
$texto preg_replace$patron,  $reemplazo$texto );
    } 
$texto es el texto a formatear.
Lo primero que hago es buscar los [LINK]www.web.com[/LINK] que existe en el texto y se guardan en $coincidencias.

Se recorre cada una de las coincidencias y se aplica la expresión regular /javascript:/i para ver si existe la cadena prohibida.
Si existe la cadena prohibida, no se traduce [LINK] a <a href..>;
Si no existe la cadena prohibida se traduce [LINK] a <a href...>;

Y ya está.