¿Qué es una expresión regular que coincidirá con un nombre de dominio válido sin un subdominio?

123

Necesito validar un nombre de dominio:

google.com

stackoverflow.com

Entonces, un dominio en su forma más cruda, ni siquiera un subdominio como www.

  1. Los caracteres solo deben ser az | AZ | 0-9 y punto (.) Y guión (-)
  2. La parte del nombre de dominio no debe comenzar ni terminar con un guión (-) (por ejemplo, -google-.com)
  3. La parte del nombre de dominio debe tener entre 1 y 63 caracteres
  4. La extensión (TLD) puede ser cualquier cosa bajo las reglas n. ° 1 por ahora, puedo validarlas con una lista más adelante, aunque debería tener 1 o más caracteres

Editar: TLD aparentemente tiene 2-6 caracteres tal como está

No. 4 revisado: TLD en realidad debería estar etiquetado como "subdominio", ya que debería incluir cosas como .co.uk - Me imagino que la única validación posible (aparte de verificar una lista) sería 'después del primer punto debería haber uno o más personajes bajo las reglas # 1

Muchas gracias, créanme que lo intenté!

Dominic
fuente
1
Puede no ser de ayuda en absoluto. Cuando se trata de google.co.uk y de algunos dominios japoneses, estoy seguro de que tendrá que pensarlo dos veces antes de usar expresiones regulares para eso. Mi pensamiento personal es que la expresión regular no es suficiente para validar un dominio en un dominio de la vida real. Para su información, aquí hay una lista casi completa de tlds y la lista de dominios de segundo nivel de código de país: static.ayesh.me/misc/SO/tlds.txt
Ayesh K
1
Vea mi respuesta a la pregunta relacionada sobre la validación del nombre de host .
SAM
2
A menudo olvidado: para nombres de dominio completos, debe coincidir con un punto después del tld.
schmijos
1
Han
1
Algunas de estas respuestas son bastante buenas, pero también hay otra buena respuesta a esta otra pregunta que vale la pena ver.
craftworkgames

Respuestas:

49

Bueno, es bastante sencillo, un poco más astuto de lo que parece (ver comentarios), dados sus requisitos específicos:

/^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]{2,}$/

Pero tenga en cuenta que esto rechazará muchos dominios válidos.

Cameron
fuente
Agradable gracias, este parece estar funcionando. ¿Sabes qué tipo de dominios no pasarán la validación?
Domingo
12
@infensus: si bien esta expresión regular es correcta dadas sus especificaciones, sus especificaciones son incorrectas. g.coes un nombre de dominio válido pero gsolo tiene un carácter.
sch
3
Esto debería coincidir con todos los casos que creo: ^ ([a-z0-9]) (([a-z0-9 -] {1,61})? [A-z0-9] {1})? (\. [a-z0-9] (([a-z0-9 -] {1,61})? [a-z0-9] {1})?)? (\. [a-zA-Z] {2 , 4}) + $
transilvlad
1
x.com no pasaría aquí
Neil McGuigan
4
@Neil: Tienes razón. La pregunta original pedía de 3 a 63 caracteres (ver edición 3). Puede ser cambiado para apoyar los dominios de un carácter bastante facilidad: /^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.[a-zA-Z]{2,}$/. Pero esto aún rechaza toneladas de cosas válidas ...
Cameron
85

Sé que esta es una publicación un poco antigua, pero a todas las expresiones regulares aquí les falta un componente muy importante: el soporte para nombres de dominio IDN.

Los nombres de dominio IDN comienzan con xn--. Permiten caracteres UTF-8 extendidos en nombres de dominio. Por ejemplo, ¿sabía que "♡ .com" es un nombre de dominio válido? ¡Sí, "love heart dot com"! Para validar el nombre de dominio, debe dejar que http://xn--c6h.com/ pase la validación.

Tenga en cuenta que para usar esta expresión regular, deberá convertir el dominio a minúsculas y también usar una biblioteca IDN para asegurarse de codificar los nombres de dominio en ACE (también conocido como "Codificación compatible con ASCII"). Una buena biblioteca es GNU-Libidn.

idn (1) es la interfaz de línea de comandos para la biblioteca de nombres de dominio internacionalizados. El siguiente ejemplo convierte el nombre de host en UTF-8 en codificación ACE. La URL resultante https: //nic.xn--flw351e/ se puede utilizar como equivalente codificado en ACE de https: // nic. 谷 歌 / .

  $ idn --quiet -a nic.谷歌
  nic.xn--flw351e

Esta expresión regular mágica debería cubrir la mayoría de los dominios (aunque estoy seguro de que hay muchos casos extremos válidos que me he perdido):

^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,1}\.(xn--)?([a-z0-9\-]{1,61}|[a-z0-9-]{1,30}\.[a-z]{2,})$

Al elegir una expresión regular de validación de dominio, debería ver si el dominio coincide con lo siguiente:

  1. xn--stackoverflow.com
  2. stackoverflow.xn - com
  3. stackoverflow.co.uk

Si estos tres dominios no pasan, es posible que su expresión regular no permita dominios legítimos.

Revisa página de Soporte de nombres de dominio internacionalizados de la Guía del entorno de idiomas internacionales de Oracle para obtener más información.

No dude en probar la expresión regular aquí: http://www.regexr.com/3abjr

ICANN mantiene una lista de tlds que se han delegado que se puede utilizar para ver algunos ejemplos de dominios IDN.


Editar:

 ^(((?!-))(xn--|_{1,1})?[a-z0-9-]{0,61}[a-z0-9]{1,1}\.)*(xn--)?([a-z0-9][a-z0-9\-]{0,60}|[a-z0-9-]{1,30}\.[a-z]{2,})$

Esta expresión regular detendrá los dominios que tienen '-' al final de un nombre de host como marcados como válidos. Además, permite subdominios ilimitados.

Tim Groeneveld
fuente
1
Tenga en cuenta que esto solo admitirá un máximo de un subdominio, cualquier más que eso resultará en falso. No es algo que eres la difamación para funcionar en menos de usarlo para sitios internos, etc ... Un intento rápida para que pueda apoyar más subdominios:/^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,}\.?((xn--)?([a-z0-9\-.]{1,61}|[a-z0-9-]{1,30})\.?[a-z]{2,})$/i
stakolee
1
Pero los TLD solitarios no funcionan :( Por ejemplo, to.( to. ) Es una URL válida con contenido.
iiic
@iiic, sí, pero to.no es un nombre de dominio completamente calificado. Si desea permitir dominios de nivel superior, debe usar algo como ^(((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,1}\.)?(x--)?([a-z0-9\-]{1,61}|[a-z0-9-]{1,30}\.[a-z]{2,})\.?$, pero tenga cuidado, ¡dejará pasar a las personas que ingresen dominios como testo natambién!
Tim Groeneveld
Acepta invali.dcomo un nombre de dominio válido mientras invali.d.co.ukno sea válido.
Pawel Krakowiak
1
Cabe señalar que xn--stackoverflow.comno es un nombre válido ya que 'stackoverflow' no se puede convertir de Punycode. Sin embargo, eso está más allá de lo que puede hacer una expresión regular. Como observación general, las xn--[a-z0-9]+etiquetas serían solo IDN mientras que xn--[a-z0-9]+\-[a-z0-9]+indican una combinación de caracteres ASCII y no ASCII
Marcus
50

Mi expresión regular es la siguiente:

^[a-zA-Z0-9][a-zA-Z0-9-_]{0,61}[a-zA-Z0-9]{0,1}\.([a-zA-Z]{1,6}|[a-zA-Z0-9-]{1,30}\.[a-zA-Z]{2,3})$

está bien para i.oh1.me y para wow.british-library.uk

UPD

Aquí está la regla actualizada

^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,6}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})$

Visualización de expresiones regulares

https://www.debuggex.com/r/y4Xe_hDVO11bv1DV

ahora es comprobar si hay -o _en el inicio o al final de la etiqueta de dominio.

paka
fuente
9
Parece bastante bueno, pero los {2,6}criterios deberán actualizarse para el nuevo TLD. Probablemente {2,}.
jwatts1980
@ jwatts1980 ¿hay ejemplos de tales zonas? ¿O te refieres a posibles zonas futuras?
paka
1
Aquí hay un artículo que analiza los próximos cambios con ejemplos y enlaces a recursos relacionados: zdnet.com/…
jwatts1980
1
¿Por qué ([a-zA-Z] {1} [a-zA-Z] {1}) y no ([a-zA-Z] {2})?
Anton
3
la última parte con las dos alternativas también es incorrecta: existen ccTLD (dos letras) que aceptan subetiquetas IDNA. También existen ahora etiquetas de TLD que ya utilizan etiquetas IDNA. No debe poner un caso especial en la última etiqueta que no es diferente de las demás (y ahora tiene muchas extensiones agregadas con longitudes variables, pero como todas las demás etiquetas en los subdominios. Tenga en cuenta que las etiquetas IDNA también pueden aparecer codificadas en Punycoded (en cuyo caso habrá "- - "un segmento en la etiqueta, el único caso donde" - "está permitido en las etiquetas. Finalmente, el guión bajo no es válido en todas partes en todas las etiquetas.
verdy_p
24

Mi apuesta:

^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]$

Explicado:

El nombre de dominio se crea a partir de segmentos. Aquí hay un segmento (excepto el final):

[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?

Puede tener de 1 a 63 caracteres, no comienza ni termina con '-'.

Ahora agregue '.' y repetir al menos una vez:

(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+

Luego adjunte el segmento final, que tiene entre 2 y 63 caracteres:

[a-z0-9][a-z0-9-]{0,61}[a-z0-9]

Pruébelo aquí: http://regexr.com/3au3g

Yaroslav Stavnichiy
fuente
@GaneshBabu ¿Qué quieres decir con coincidencias exactas?
Yaroslav Stavnichiy
1
Todas las demás respuestas no funcionaron para mí, pero esta sí.
Danny Coulombe
Tenía un requisito similar en el que quiero evitar el punto y coma y la coma al final. Intenté mucho, pero a continuación no tuve éxito. Estoy usando const regexDomain = / ^ (?: [A-Za-z0-9] (?: [A-Za-z0-9 -] {0,61} [A-Za-z0-9])? \.) + [A-Za-z0-9] [A-Za-z0-9 -] { 0,61} [A-Za-z0-9] / g; Bueno, valida si lo uso, y; en el medio pero falla al final de vliadate.
Harry
Encontré varios dominios que deberían ser válidos pero no son válidos con su expresión regular. Por ejemplo, редбулл.москва es un dominio válido o también редбулл.рф y 红色 的 公牛. 中国
pubkey
1
@pubkey, debe convertir esos nombres de dominio a punycode . El nombre real de редбулл.москва es xn - 90afc0aazy.xn - 80adxhks Y mi expresión regular coincide con ella.
Yaroslav Stavnichiy
13

Solo una pequeña corrección: la última parte debe ser hasta 6. Por lo tanto,

^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}$

El TLD más largo es museum(6 caracteres): http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains

ahadinyoto
fuente
3
Nota: Esto no pasará el nombre de dominio válido (aunque raro) www.my---domain.com
Chris Bier
17
No se corta con un nuevo TLD, por ejemplo.photography
Sam Figueroa
2
@SamFigueroa Solo tendrás que modificar su longitud
Steel Brain
3
no debería haber una verificación para el TLD, no es diferente de los subdominios. Y basar la expresión regular en availabletlds actuales no es una prueba para el futuro.
Loïc Faure-Lacroix
1
Sugiera que el último bit sea {2,63}: consulte stackoverflow.com/questions/9238640/…
Eric Dobbs
13

La respuesta aceptada no funciona para mí, intente esto:

^ ((?! -) [A-Za-z0-9 -] {1,63} (? <! -) \.) + [A-Za-z] {2,6} $

Visite los casos de prueba de esta unidad para su validación.

mkyong
fuente
4
no hay soporte para nuevos nombres de TLD más largos como .audio, .photography, y la mayoría de estos ... data.iana.org/TLD/tlds-alpha-by-domain.txt
mrbinky3000
@ mrbinky3000 Simplemente cambie el último {2,6}por otro y funcionará. Mío:^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
Mygod
@Mygod, su expresión regular contiene un poco de basura de ancho cero más allá del último signo de interrogación, por lo que cualquiera que lo copie se sorprenderá desagradablemente
MightyPork
1
@MightyPork ¡Tienes razón! Lo siento, aquí hay una versión limpia (con suerte):^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
Mygod
Muy agradable. Por desgracia, las expresiones retrospectivas no son válidas en JavaScript. : /
PhiLho
13

Esta respuesta es para nombres de dominio (incluidos RR de servicio), no nombres de host (como un nombre de host de correo electrónico).

^(?=.{1,253}\.?$)(?:(?!-|[^.]+_)[A-Za-z0-9-_]{1,63}(?<!-)(?:\.|$)){2,}$

Básicamente es la respuesta de mkyong y, además:

  • Longitud máxima de 255 octetos, incluidos los prefijos de longitud y la raíz nula.
  • Permitir el seguimiento de '.' para raíz dns explícita.
  • Permitir "_" inicial para los RR de dominio de servicio (errores: no aplica un máximo de 15 caracteres para las etiquetas _, ni requiere al menos un dominio por encima de los RR de servicio)
  • Coincide con todos los TLD posibles.
  • No captura etiquetas de subdominio.

Por partes

Lookahead, limite la longitud máxima entre ^ $ a 253 caracteres con el literal final opcional '.'

(?=.{1,253}\.?$)

Mirando hacia adelante, el siguiente carácter no es un '-' y ningún '_' sigue a ningún carácter antes del siguiente '.'. Es decir, imponga que el primer carácter de una etiqueta no sea un '-' y solo el primer carácter puede ser un '_'.

(?!-|[^.]+_)

Entre 1 y 63 de los caracteres permitidos por etiqueta.

[A-Za-z0-9-_]{1,63}

Mirar hacia atrás, el carácter anterior no es '-'. Es decir, imponga que el último carácter de una etiqueta no sea un '-'.

(?<!-)

Forzar un '.' al final de cada etiqueta excepto la última, donde es opcional.

(?:\.|$)

Principalmente combinado desde arriba, esto requiere al menos dos niveles de dominio, lo cual no es del todo correcto, pero generalmente es una suposición razonable. Cambie de {2,} a + si desea permitir TLD o subdominios relativos no calificados a través (por ejemplo, localhost, myrouter, to.)

(?:(?!-|[^.]+_)[A-Za-z0-9-_]{1,63}(?<!-)(?:\.|$)){2,}

Pruebas unitarias para esta expresión.

Andrew Domaszek
fuente
1
¡Gracias! Esta es la mejor expresión regular aquí. Su explicación detallada y la prueba unitaria son una ventaja.
Naudster
¿Qué significa "RR"?
Wheeler
Registro de recursos. Por lo general, un campo de texto o informativo que le indica cómo interactuar con un servicio.
Andrew Domaszek
Esta expresión regular no es correcta. Por ejemplo, el dominio redbull. 移动 es válido pero la expresión regular no coincidirá.
pubkey
Convierta primero a punycode y luego haga coincidir. Los límites de longitud en la versión anterior a Punycode son realmente difíciles de implementar.
Andrew Domaszek
8

Gracias por señalar la dirección correcta en las soluciones de validación de nombres de dominio en otras respuestas. Los nombres de dominio se pueden validar de varias formas.

Si necesita validar el dominio IDN en su forma legible por humanos , regex \p{L}lo ayudará. Esto permite hacer coincidir cualquier carácter en cualquier idioma.

Tenga en cuenta que la última parte también puede contener guiones . Como los nombres chinos codificados con punycode pueden tener caracteres Unicode en tld.

He llegado a una solución que coincidirá, por ejemplo:

  • google.com
  • masełkowski.pl
  • maselkowski.pl
  • m.maselkowski.pl
  • www.masełkowski.pl.com
  • xn--masekowski-d0b.pl
  • 中国 互联 网络 信息 中心. 中国
  • xn - fiqa61au8b7zsevnm8ak20mc4a87e.xn - fiqs8s

Regex es:

^[0-9\p{L}][0-9\p{L}-\.]{1,61}[0-9\p{L}]\.[0-9\p{L}][\p{L}-]*[0-9\p{L}]+$

Compruebe y sintonice aquí

NOTA: Esta expresión regular es bastante permisiva, al igual que el conjunto de caracteres permitido para los nombres de dominio actuales.

ACTUALIZACIÓN : aún más simplificado, ya que a-aA-Z\p{L}es igual que\p{L}

NOTA 2: El único problema es que coincidirá con los dominios con puntos dobles ..., como masełk..owski.pl. Si alguien sabe cómo solucionar este problema, mejore.

PeterM
fuente
Podemos usar [:alpha:]y en [:digit]lugar de \p{L}. Funciona bien.
puchu
No puede validar un IDN de esta manera sin antes convertirlo a punycode. Por ejemplo, con su expr, 中国互联网络信息中心中国互联网络信息中心中国互联网络信.中国verifica como válido, pero después de la conversión de IDN, son demasiados bytes por etiqueta. \ p {L} coincide con símbolos, no con bytes de código pequeño (que varían de un símbolo a otro), por lo que el conteo repetido no es útil cuando se trata de limitar su tamaño posterior a la conversión.
Andrew Domaszek
Buen punto, cada parte está limitada a 64 bytes. Sin embargo, no podemos verificarlo con RegExp, por lo que se requieren más pasos de validación usando el decodificador punycode, que fallará con su nombre de host de ejemplo. Los chinos deben estar locos por esta limitación.
PeterM
7
^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,7}$

[dominio - letras minúsculas y solo 0-9] [puede tener un guión] + [TLD - solo minúsculas, debe tener entre 2 y 7 letras]
http://rubular.com/ ¡ es genial para probar expresiones regulares!
Editar: TLD actualizado como máximo a 7 caracteres para '.rentals' como señaló Dan Caddigan.

Chris
fuente
1
¿Por qué limitar los TLD? Ahora .photographysería inválido. Simplemente conviértalo en caracteres ilimitados o algo así.
adriaan
5

Aún no hay suficiente representante para comentar. En respuesta a la solución de paka, descubrí que necesitaba ajustar tres elementos:

  • El guión y el guión bajo se movieron debido a que el guión se interpretó como un rango (como en "0-9")
  • Se agregó un punto final para los nombres de dominio con muchos subdominios.
  • Se extendió la longitud potencial de los TLD a 13

Antes de:

^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,6}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})$

Después:

^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][-_\.a-zA-Z0-9]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,13}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})$
zaTricky
fuente
3

Para nuevos gTLD

/^((?!-)[\p{L}\p{N}-]+(?<!-)\.)+[\p{L}\p{N}]{2,}$/iu
Ben Keil
fuente
2
Por favor, danos algunos detalles más. ¿Lo que respondes es mejor que los demás? ¿Qué coincide más? Edite su publicación directamente para agregar la información.
Sven R.
Como escribí: nuevos gTLD. Dominios con caracteres Unicode y también TLD Unicode.
Ben Keil
1
@BenKeil: ¿De qué trata esta parte: (? <! -)
jor
@jor eso es negativo mirar atrás. Echa un vistazo a shortcutfoo.com/app/dojos/regex/cheatsheet
Muhammad Faizan
3

Como ya se señaló, no es obvio decir subdominios en el sentido práctico (por ejemplo, .co.ukdominios). Usamos esta expresión regular para validar dominios que ocurren en la naturaleza. Cubre todos los casos de uso práctico que conozco. Los nuevos son bienvenidos. De acuerdo con nuestras pautas , evita los grupos que no capturan y las coincidencias codiciosas.

^(?!.*?_.*?)(?!(?:[\d\w]+?\.)?\-[\w\d\.\-]*?)(?![\w\d]+?\-\.(?:[\d\w\.\-]+?))(?=[\w\d])(?=[\w\d\.\-]*?\.+[\w\d\.\-]*?)(?![\w\d\.\-]{254})(?!(?:\.?[\w\d\-\.]*?[\w\d\-]{64,}\.)+?)[\w\d\.\-]+?(?<![\w\d\-\.]*?\.[\d]+?)(?<=[\w\d\-]{2,})(?<![\w\d\-]{25})$

Prueba, explicación y ejemplos: https://regex101.com/r/FLA9Bv/9 ( Nota: actualmente solo funciona en Chrome porque la expresión regular usa lookbehinds que solo son compatibles con ECMA2018 )

Hay dos enfoques para elegir al validar dominios.

Coincidencia de FQDN según los libros (definición teórica, rara vez encontrada en la práctica):

  • 253 caracteres como máximo (según RFC-1035 / 3.1 , RFC-2181/11 )
  • 63 caracteres como máximo por etiqueta (según RFC-1035 / 3.1 , RFC-2181/11 )
  • se permiten todos los caracteres (según RFC-2181/11 )
  • Los TLD no pueden ser totalmente numéricos (según RFC-3696/2 )
  • Los FQDN se pueden escribir de forma completa, que incluye la zona raíz (el punto final)

Coincidencia de FQDN práctica / conservadora (definición práctica, esperada y respaldada en la práctica):

  • según los libros que coincidan con las siguientes excepciones / adiciones
  • Caracteres válidos: [a-zA-Z0-9.-]
  • las etiquetas no pueden comenzar ni terminar con guiones (según RFC-952 y RFC-1123 / 2.1 )
  • La longitud mínima de TLD es de 2 caracteres, la longitud máxima es de 24 caracteres según los registros existentes actualmente
  • no coincide con el punto final
este es mi diseño
fuente
2
^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]+(\.[a-zA-Z]+)$
usuario desconocido
fuente
5
-1 para la adición de {2,4}. Es posible tener TLD de un solo carácter (sin embargo, actualmente no hay ninguno en la raíz). ¿Qué pasa con .mobile? .asociados? Ambos son TLD válidos y esta expresión regular los rechazaría. data.iana.org/TLD/tlds-alpha-by-domain.txt
Tim Groeneveld
2

Aquí hay un código completo con un ejemplo:

<?php
function is_domain($url)
{
    $parse = parse_url($url);
    if (isset($parse['host'])) {
        $domain = $parse['host'];
    } else {
        $domain = $url;
    }

    return preg_match('/^(?!\-)(?:[a-zA-Z\d\-]{0,62}[a-zA-Z\d]\.){1,126}(?!\d+)[a-zA-Z\d]{1,63}$/', $domain);
}

echo is_domain('example.com'); //true
echo is_domain('https://example.com'); //true
echo is_domain('https://.example.com'); //false
echo is_domain('https://localhost'); //false
Maulik Gangani
fuente
2
^((localhost)|((?!-)[A-Za-z0-9-]{1,63}(?<!-)\.)+[A-Za-z]{2,253})$

Gracias @mkyong por la base de mi respuesta. Lo modifiqué para admitir etiquetas aceptables más largas.

Además, "localhost" es técnicamente un nombre de dominio válido. Modificaré esta respuesta para dar cabida a los nombres de dominio internacionalizados.

Nate Watson
fuente
0
/^((([a-zA-Z]{1,2})|([0-9]{1,2})|([a-zA-Z0-9]{1,2})|([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]))\.)+[a-zA-Z]{2,6}$/
  • ([a-zA-Z]{1,2}) -> por aceptar solo dos caracteres.

  • ([0-9]{1,2})-> para aceptar solo dos números

si algo excede más de dos, ([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9])esta expresión regular se encargará de eso.

Si queremos hacer el emparejamiento durante al menos una vez +se utilizará.

priya
fuente
0

^ [a-zA-Z0-9] [- a-zA-Z0-9] + [a-zA-Z0-9]. [az] {2,3} (. [az] {2,3}) ? (. [az] {2,3})? $

Ejemplos que funcionan:

stack.com
sta-ck.com
sta---ck.com
9sta--ck.com
sta--ck9.com
stack99.com
99stack.com
sta99ck.com

También funcionará para extensiones

.com.uk
.co.in
.uk.edu.in

Ejemplos que no funcionarán:

-stack.com

funcionará incluso con la extensión de dominio más larga ".versicherung"

Khan sigue
fuente
0
  • ^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,}\.?((xn--)?([a-z0-9\-.]{1,61}|[a-z0-9-]{0,30})\.[a-z-1-9]{2,})$

validará dichos dominios яндекс.рфdespués de la codificación.

https://regex101.com/r/Hf8wFM/1 - zona de pruebas

Danila Kulakov
fuente
0

La siguiente expresión regular extrae el sub, root y tld de un dominio dado:

^(?<domain>(?<domain_sub>(?:[^\/\"\]:\.\s\|\-][^\/\"\]:\.\s\|]*?\.)*?)(?<domain_root>[^\/\"\]:\s\.\|\n]+\.(?<domain_tld>(?:xn--)?[\w-]{2,7}(?:\.[a-zA-Z-]{2,3})*)))$

Probado para los siguientes dominios:

* stack.com
* sta-ck.com
* sta---ck.com
* 9sta--ck.com
* sta--ck9.com
* stack99.com
* 99stack.com
* sta99ck.com
* google.com.uk
* google.co.in

* google.com
* masełkowski.pl
* maselkowski.pl
* m.maselkowski.pl
* www.masełkowski.pl.com
* xn--masekowski-d0b.pl
* xn--fiqa61au8b7zsevnm8ak20mc4a87e.xn--fiqs8s

* xn--stackoverflow.com
* stackoverflow.xn--com
* stackoverflow.co.uk
landen99
fuente