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, $coincidencias, PREG_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( $cadena, 5, strlen( $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á.