Validación de URL de PHP

Sé que hay infinidad de hilos haciendo esta pregunta, pero no he podido encontrar uno que me pueda ayudar con esto.

Básicamente, estoy tratando de analizar una lista de alrededor de 10,000,000 de URL, asegurarme de que sean válidas según los siguientes criterios y luego obtener la URL del dominio raíz. Esta lista contiene casi todo lo que pueda imaginar, incluidas cosas como (y la URL formateada esperada):

biy.ly/test [VALID] [return - bit.ly]
example.com/apples?test=1&id=4 [VALID] [return - example.com]
host101.wow404.apples.test.com/cert/blah [VALID] [return - test.com]
101.121.44.xxx [**inVALID**] [return false]
localhost/noway [**inVALID**] [return false]
www.awesome.com [VALID] [return - awesome.com]
i am so awesome [**inVALID**] [return false]
http://404.mynewsite.com/visits/page/view/1/ [VALID] [return - mynewsite.com]
www1.151.com/searchresults [VALID] [return - 151.com]

¿Alguien tiene alguna sugerencia para esto?

preguntado el 03 de mayo de 12 a las 17:05

Realmente no estás validando nada con los criterios dados. ¿También desea realizar una búsqueda de WHOIS para ver si el dominio realmente existe? -

¿A qué vas exactamente? localhost is una URL válida. someverylongdomainnamethatprobablydoesntexist.com también lo es, pero probablemente no existe. -

@yAnTar: la sintaxis de los enlaces en los comentarios es [link text](URL). -

"No he podido encontrar uno que pueda ayudarme con esto". - No has buscado lo suficiente. -

4 Respuestas

^(?:https?://)?(?:[a-z0-9-]+\.)*((?:[a-z0-9-]+\.)[a-z]+)

Explicación

^                # start-of-line
(?:              # begin non-capturing group
  https?         #   "http" or "https"
  ://            #   "://"
)?               # end non-capturing group, make optional
(?:              # start non-capturing group
  [a-z0-9-]+\.   #   a name part (numbers, ASCII letters, dashes) & a dot
)*               # end non-capturing group, match as often as possible
(                # begin group 1 (this will be the domain name)
  (?:            #   start non-capturing group
    [a-z0-9-]+\. #     a name part, same as above
  )              #   end non-capturing group
  [a-z]+         #   the TLD
)                # end group 1 

http://rubular.com/r/g6s9bQpNnC

contestado el 03 de mayo de 12 a las 17:05

Gracias por esto. Me encanta la explicación. - Rohit Chopra

Para los lectores, tenga en cuenta que las URL pueden tener caracteres que no sean ascii. Esta expresión regular no coincidirá http://myurl.com/?utf8=✓ ver (rubular.com/r/I4fvV3VHVT). Agregar el parámetro utf8 es un truco que se usa para forzar la codificación utf8 en navegadores más antiguos, consulte (programadores.stackexchange.com/questions/168751/…) - Dana la cuerda

@DanatheSane Tienes toda la razón. De hecho, algo mejor pensado como Daring Fireball: un patrón Regex liberal y preciso para hacer coincidir las URL debería ser usado. - Tomalak

Gracias por el enlace, parece difícil encontrar soluciones integrales a este problema. - Dana la cuerda

Comenzaría con el valor predeterminado:

filter_var($inputUrl, FILTER_VALIDATE_URL);

Luego agregue sus casos especiales de cosas que no son aceptables para una mayor validación. Esto debería simplificar un poco.

En cuanto a conseguir el anfitrión.

parse_url($inputUrl, PHP_URL_HOST);

contestado el 03 de mayo de 12 a las 18:05

@RohitChopra eso no es del todo cierto. FILTER_VALIDATE_URL valida según las especificaciones RFC 2396 para URL válidas. faqs.org/rfcs/rfc2396.html - dqhendricks

También hay dos banderas opcionales que puede usar con este validador, FILTER_FLAG_PATH_REQUIRED y FILTER_FLAG_QUERY_REQUIRED. - dqhendricks

^(([a-zA-Z](\.[a-zA-Z])+)|([0-9]{1,3}(\.[0-9]{1,3}){3})/.*$

editar

en php eso seria preg_match ( '^(([a-zA-Z](\.[a-zA-Z])+)|([0-9]{1,3}(\.[0-9]{1,3}){3})/.*$' , $myUrls , $matches)

Lo que necesitas estaría en $matches[1]

contestado el 03 de mayo de 12 a las 17:05

Los nombres de dominio pueden contener otros caracteres además de los símbolos latinos. Esta expresión regular falla incluso con www1.151.com mencionado en la pregunta - Galymzhan

$website = test_input($_POST["website"]);
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$w$website = test_input($_POST["website"]);
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website))
  {
  $websiteErr = "Invalid URL";
  }ebsite))
  {
  $websiteErr = "Invalid URL";
  }

Respondido 16 Oct 13, 13:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.