2010-08-04 8 views
5

Estoy tratando de probar la validez de una URL ingresada con php5. Pensé en usar Regex, pero suponiendo que funcione correctamente todo el tiempo, solo resuelve el problema de que la URL es sintácticamente válida. No me dice nada acerca de que la URL sea correcta o funcione.Es regex una buena manera de probar una url

Estoy tratando de encontrar otra solución para hacer ambas cosas si es posible. ¿O es mejor encontrar 2 soluciones separadas para esto?

Si un regex es el camino a seguir, ¿qué expresiones regulares probadas existen para las URL?

+2

incluso probar si existe una url "ahora" no significa que existirá "cuando" desea renderizar/usarlo más adelante. – scunliffe

+2

¿Por qué está probando si una URL es válida? En general, como desarrollador web, ¿no sabes de antemano que la URL es válida? En la mayoría de los CMS u otros sistemas, las URL válidas son archivos o entradas de bases de datos, pero verificar eso dependerá completamente de su configuración. Alguna información más ayudaría a guiar una respuesta, sea específico acerca de su situación. –

+2

@Owen, la url es la entrada del usuario – Berming

Respuesta

11

En lugar de craqueo cabeza por una expresión regular (URL son muy complicado), sólo tiene que utilizar filter_var(), y luego intente hacer ping a la dirección URL utilizando cURL:

if (filter_var($url, FILTER_VALIDATE_URL) !== false) 
{ 
    $ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_HEADER, true); 
    curl_setopt($ch, CURLOPT_NOBODY, true); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 30); 
    curl_exec($ch); 
    $status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
    curl_close($ch); 

    if ($status_code >= 200 && $status_code < 400) 
    { 
     echo 'URL is valid!'; 
    } 
} 
+0

Si no me equivoco, el ping solo comprueba si el dominio existe, no si la URL completa está disponible. –

+0

@Marcel Korpel: buen punto. Edité mi respuesta para usar cURL, que debería ser más viable. – BoltClock

+6

También agregaría el método HEAD allí. Alguien podría indicarle un archivo de 1GB de tamaño y su servidor lo descargará alegremente de otra manera. Además, no es bueno descargar algo si solo quieres comprobar si existe, para eso es HEAD. –

2

Para comprobar que una URL es "correcta o funcional", deberá tratar de interactuar con ella (como haría un navegador web, por ejemplo).

Yo recomendaría una biblioteca HTTP para Perl como LWP::Simple para hacerlo.

+0

Entonces, debería dividirlo en 2 tareas. – Berming

+0

Absolutamente. Usted está haciendo dos preguntas completamente diferentes, por ejemplo: ¿es http://google.com una URL HTTP válida? ... y ... ¿puedo HTTP OBTENER el recurso definido por http://google.com en la red en este momento? Otro ejemplo de cómo difieren las preguntas: la respuesta a la primera pregunta será la misma a lo largo del tiempo, la respuesta a la segunda cambiará si su red falla. – Brabster

1

Lo que yo haría:

  1. Compruebe que la URL sea válida utilizando una expresión regular muy abierta o filer_var con FILTER_VALIDATE_URL.
  2. Haz un file_get_contents en la url y comprueba que $http_response_header[0] contiene un resoponse HTTP 200.

Ahora, eso es sucio, seguro que hay alguna versión más elegante usando curl y esas cosas.

+1

puede simplemente usar ['get_headers'] (http://www.php.net/manual/en/function.get-headers.php) – Gordon

+0

Gracias, no conocía esa función. PHP está lleno de sorpresas;) – NikiC

1

usaría la expresión regular para resolver este problema y odio la expresión regular. Esta herramienta sin embargo hace mi vida mucho más fácil ... compruébalo >>http://gskinner.com/RegExr/

1

¡Hacer ping en una URL para ver si es una URL válida no tiene sentido!

  • Qué si el host está abajo?
  • ¿Qué pasa si el dominio no es ping-able?

Si realmente quieres hacer una prueba "en vivo", mejor tratar de resolver la URL mediante el uso de DSN. DNS es más confiable que PING o HTTP.

<?php 
$ip = gethostbyname('www.example.com'); 

echo $ip; 
?> 

Pero incluso si esto falla URL puede ser válida. Simplemente no tiene entrada de DNS. Por lo tanto, depende de sus necesidades.

Cuestiones relacionadas