php regex url dns idn

php - Adecuadamente Coincidencia de una URL IDN



regex dns (3)

Necesito ayuda para crear una expresión regular que pueda coincidir correctamente con una URL dentro de texto libre.

  • esquema
    • Uno de los siguientes: ftp , http , https (¿ ftps es un protocolo?)
  • usuario opcional (y pase opcional)
  • host (con soporte para IDN)
    • soporte para www y subdominio (s) (con soporte para IDN)
    • El filtrado básico de TLDs ( [a-zA-Z]{2,6} es suficiente, creo)
  • número de puerto opcional
  • ruta (opcional, con soporte para caracteres Unicode)
  • consulta (opcional, con soporte para caracteres Unicode)
  • fragmento (opcional, con soporte para caracteres Unicode)

Esto es lo que pude descubrir sobre los subdominios:

Un "subdominio" expresa dependencia relativa, no dependencia absoluta: por ejemplo, wikipedia.org comprende un subdominio del dominio de la organización, y en.wikipedia.org comprende un subdominio del dominio wikipedia.org. En teoría, esta subdivisión puede bajar a 127 niveles de profundidad, y cada etiqueta DNS puede contener hasta 63 caracteres, siempre que el nombre de dominio completo no exceda una longitud total de 255 caracteres.

Respecto al nombre de dominio en sí no pude encontrar ninguna fuente confiable, pero creo que la expresión regular para los que no son IDN (no estoy seguro de cómo escribir una versión compatible con IDN) es algo así como:

[0-9a-zA-Z][0-9a-zA-Z/-]{2,62}

¿Puede alguien ayudarme con esta expresión regular o señalarme una buena dirección?


Esto te llevará la mayor parte del camino hasta allí. Si lo necesita más refinado, proporcione datos de prueba.

(ftp|https?)://([-/w/.]+)+(:/d+)?(/([/w/_/.]*(/?/S+)?)?)?


John Gruber, de la fama de Daring Fireball, recientemente publicó una publicación que detallaba su búsqueda de una buena cadena de expresiones regulares con reconocimiento de URL. Lo que se le ocurrió fue esto:

/b(([/w-]+://?|www[.])[^/s()<>]+(?:/([/w/d]+/)|([^[:punct:]/s]|/)))

Lo cual aparentemente también funciona con URLs que contienen Unicode. Tendría que hacer una pequeña modificación para obtener el resto de lo que está buscando: esquema, nombre de usuario, contraseña, etc. Alan Storm escribió una pieza que explica el patrón de expresiones regulares de Gruber , que definitivamente necesitaba (la expresión regular es así que escribe una vez, no tienes ni idea, cómo leer, nunca más!


Si necesita el protocolo y no está demasiado preocupado por los falsos positivos, con mucho, lo más fácil es hacer coincidir todos los caracteres que no sean de espacios en blanco ://