Me he topado con una función que permite validar urls de diferentes tipos:
https://usuario:contraseña@www.cualquiersitio.com:8080/login.php?do=login&style=%23#pagetop
http://usuario@www.cualquiersitio.com/#pagetop
https://cualquiersitio.com/index.html
ftp://usuario:****@cualquiersitio.com:21/
http://cualquiersitio.com/index.html/
//se le envía una cadena y devuelve true si es uan url válida o false en caso contrario function url_valida($url){ static $urlregex = "^(https?|ftp)\:\/\/([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?[a-z0-9+\$_-]+(\.[a-z0-9+\$_-]+)*(\:[0-9]{2,5})?(\/([a-z0-9+\$_-]\.?)+)*\/?(\?[a-z+&\$_.-][a-z0-9;:@/&%=+\$_.-]*)?(#[a-z_.-][a-z0-9+\$_.-]*)?\$"; return eregi($urlregex, $url); }
Explicación paso a paso:
function url_valida($url){ //TIPO DE CONEXIÓN $urlregex = "^(https?|ftp)\:\/\/"; //USUARIO Y CONTRASEÑA (opcional) $urlregex .= "([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?"; //EL NOMBRE DE LA WEB O LA IP $urlregex .= "[a-z0-9+\$_-]+(\.[a-z0-9+\$_-]+)*"; // http://x = allowed (ejemplo. http://localhost, http://routerlogin) //$urlregex .= "[a-z0-9+\$_-]+(\.[a-z0-9+\$_-]+)+"; // http://x.x = minimum //$urlregex .= "([a-z0-9+\$_-]+\.)*[a-z0-9+\$_-]{2,3}"; // http://x.xx(x) = minimum //PUERTO (opcional) $urlregex .= "(\:[0-9]{2,5})?"; //RUTA (opcional) $urlregex .= "(\/([a-z0-9+\$_-]\.?)+)*\/?"; //GET de la ruta (opcional) $urlregex .= "(\?[a-z+&\$_.-][a-z0-9;:@/&%=+\$_.-]*)?"; //ANCLA de la ruta (opcional) $urlregex .= "(#[a-z_.-][a-z0-9+\$_.-]*)?\$"; //COMPROBAMOS return eregi($urlregex, $url); }