2011-03-04 15 views
9

Estoy intentando validar una cadena de entrada del usuario que se usará como un subdominio. Las reglas son las siguientes:.Expresión regular para el subdominio válido en Ruby

  1. entre 1 y 63 caracteres de longitud (tomo 63 de la serie de caracteres Google Chrome parece permitir en un subdominio, no estoy seguro si en realidad es una directiva de servidor Si usted tiene una mejor asesoramiento sobre la longitud máxima válida, estoy interesado en escuchar ella)
  2. Puede contener a-zA-Z0-9, guión, guión bajo
  3. no puede comenzar o terminar con un guión o un guión

EDITAR : De entrada a continuación, he agregado lo siguiente: 4. No debe contener co guiones consecutivos o guiones bajos.

Ejemplos:

a => valid 
0 => valid 
- => not valid 
_ => not valid 
a- => not valid 
-a => not valid 
a_ => not valid 
_a => not valid 
aa => valid 
aaa => valid 
a-a-a => valid 
0-a => valid 
a&a => not valid 
a-_0 => not valid 
a--a => not valid 
aaa- => not valid 

Mi problema es que no estoy seguro de cómo especificar con una expresión regular que se le permite ser sólo un carácter de la cadena, al tiempo que precisa que no puede comenzar o terminar con una guión o guión bajo

Gracias!

+1

http://stackoverflow.com/questions/4551963/regex-help-subdomain-check – Orbit

+0

Gracias, el tema vinculado incluye una verificación de validez de dominio completo, y solo estoy buscando una cadena que sea válida para su uso como un subdominio ¿Tiene algún consejo sobre cómo modificarlo para que funcione? Parece que no puedo hacer los cambios necesarios. – gsr

Respuesta

17

Usted no puede puede tener guiones bajos en subdominios propios, pero los necesita? Después de trim ming su entrada, hacer una simple comprobación de longitud de la cadena, a continuación, prueba con esto:

/^[a-z\d]+(-[a-z\d]+)*$/i 

Con lo anterior, no se va a - caracteres consecutivos, por ejemplo a-bbb-ccc pasa y a--d falla.

/^[a-z\d]+([-_][a-z\d]+)*$/i 

Permitirá caracteres de subrayado no consecutivos también.


Actualización: encontrará que, en la práctica, no se permiten guiones y todos los subdominios debe comenzar con una letra. La solución anterior no permite subdominios internacionalizados (punycode). Usted es mejor de usar este

/\A([a-z][a-z\d]*(-[a-z\d]+)*|xn--[\-a-z\d]+)\z/i 
+0

Después de pensarlo, estoy de acuerdo en que permitir guiones consecutivos y guiones bajos representaría subdominios muy feos. Apreciar la entrada. Esto funciona genial – gsr

+0

Estaba pensando en dominios que son más restrictivos pero no me molestaría en permitir separadores consecutivos como la respuesta seleccionada, se verán feos y no agregarán usabilidad/readapibilidad. – Walf

+0

esta expresión regular es lo que necesito, pero cómo forzar la longitud mínima de la cadena completa. Probé diferentes configuraciones con {n,} en diferentes lugares, pero nada funcionó. – webdeb

-1

/[^\W\_](.+?)[^\W\_]$/i debería funcionar para ti (prueba nuestro http://rubular.com/ de probar expresiones regulares)

EDIT: En realidad, esto no comprueba letras/números individuales/dobles. pruebe /([^\W\_](.+?)[^\W\_])|([a-z0-9]{1,2})/i en su lugar, y juegue con él en rublos hasta que obtenga exactamente lo que desea (si esto ya no lo soluciona).

+0

Gracias, he estado usando rubular y es una gran herramienta de prueba. Creo que la expresión que diste tiene el mismo problema de no permitir cadenas de menos de 3 caracteres que he tenido. También parece permitir caracteres que no sean guiones y guiones bajos en el medio (a & a viene válido). También me pregunto si abandonó el^desde el principio a propósito, y si es así por qué razón. – gsr

+1

Eso coincidía con '.nNGygyG (NG (NG966% & i'), y coincidiría con mucha otra basura también. Necesitas leer sobre expresiones regulares. Las secciones de PCRE de los manuales de php son bastante útiles. – Walf

+0

Gracias @Lucas, lo olvidé para incluir caracteres de cero coincidencias dentro de la coincidencia de repetición. Ignore mi sugerencia :) – William

0
/^([a-z0-9][a-z0-9\-\_]{0,61}[a-z0-9]|[a-z0-9])$/i 

Me he tomado como un reto para crear una expresión regular que debe coincidir con sólo cadenas con guiones o guiones que no se repite y también comprobar la longitud adecuada para usted:

/^([a-z0-9]([_\-](?![_\-])|[a-z0-9]){0,61}[a-z0-9]|[a-z0-9])$/i 

La parte media usa un vistazo para verificar eso.

+0

El original debería funcionar también para las entradas de 2 letras (por eso está el '{0,61}'. También se puede omitir el signo de interrogación, lo haré edítelo. –

+0

Sí funciona bien ahora, ¡gracias! – gsr

+0

Eso coincidirá con 'a ___ --- _____ - __-__-__ ---- __ --- __ lo que sea al final' y' lo que sea al principio^& *^& ^) ^) _ --- _-- abc'. Si insiste en permitir subdominios horribles llenos con '-' y' _', entonces debe poner paréntesis en el o: '/^([a-zA-Z0-9] [a-zA-Z0-9 \ - \ _] {0,61}? [A-zA-Z0-9] | [a-zA-Z0-9]) $/' – Walf

0

No estoy familiarizado con la sintaxis de expresiones regulares de Ruby, pero voy a asumir que es como, por ejemplo, Perl.Parece que usted quiere:

/^(?![-_])[-a-z\d_]{1,63}(?<![-_])$/i 

Rubí O si no utiliza la bandera i, basta con sustituir [-a-z\d_] con [-a-zA-Z\d_].

La razón por la que estoy usando [-a-zA-Z\d_] en lugar de la más corta [-\w] es que, mientras que casi equivalente, \w permitirá caracteres especiales como ä en lugar de sólo caracteres de tipo ASCII. Ese comportamiento se puede desactivar opcionalmente en la mayoría de los idiomas, o puede permitirlo si lo desea.

Algunos más información sobre character classes, , y lookarounds

0

^[a-zA-Z]? ([- a-zA-Z \ d] * [a-zA-Z \ d]) $

Esto simplemente impone el estándar de una manera eficiente sin retroceder. No verifica la longitud, pero Regex es ineficiente en cosas así. Simplemente verifique la longitud de la cadena (1 a 64 caracteres).

Cuestiones relacionadas