php - validar - regex only numbers between
Regex para nombres (23)
Apoyo el consejo de "darme por vencido". Incluso si considera números, guiones, apóstrofes y cosas así, algo como [a-zA-Z] aún no captaría nombres internacionales (por ejemplo, los que tienen šđčćž, alfabeto cirílico o caracteres chinos ...)
Pero ... ¿por qué estás tratando de verificar los nombres? ¿Qué errores estás tratando de atrapar? ¿No crees que las personas saben escribir su nombre mejor que tú? ;) En serio, lo único que puede hacer al tratar de verificar los nombres es irritar a las personas con nombres inusuales.
Empezando a explorar las "maravillas" de la expresión regular. Al ser alguien que aprende de prueba y error, estoy realmente luchando porque mis pruebas están arrojando una cantidad desproporcionada de errores ... Mis experimentos están en PHP usando ereg ().
De todas formas. Trabajo con los nombres y apellidos por separado pero por ahora usando la misma expresión regular. Hasta ahora tengo:
^[A-Z][a-zA-Z]+$
Cualquier cadena de longitud que comience con un capital y solo tenga letras (mayúsculas o no) para el resto. Pero donde me desmorono es lidiar con las situaciones especiales que casi pueden ocurrir en cualquier lugar.
- Nombres con guiones (Worthington-Smythe)
- Nombres con Apostophies (D''Angelo)
- Names with Spaces (Van der Humpton) - mayúsculas en el medio que pueden o no ser necesarias va más allá de mi interés en esta etapa.
- Nombres comunes (Ben & Jerry)
Tal vez haya alguna otra forma en que un nombre puede ser que no estoy pensando, pero sospecho que si puedo entender esto, puedo agregar algo más. Estoy bastante seguro de que habrá casos en que aparezca más de una de estas situaciones en un solo nombre.
Por lo tanto, creo que lo fundamental es que mi expresión regular también acepte un espacio, guiones, símbolos y apóstrofos, pero no al principio o al final del nombre para que sea técnicamente correcto.
Básicamente, estoy de acuerdo con Paul ... Siempre encontrarás excepciones, como di Caprio , DeVil , o tal.
Comentarios sobre su mensaje: en PHP, ereg generalmente se considera obsoleto (lento, incompleto) a favor de preg (expresiones elementales PCRE).
Y deberías probar algunos probador de expresiones regulares, como el poderoso Regex Coach : son geniales para probar RE rápidamente contra cadenas arbitrarias.
Si realmente necesita resolver su problema y no está satisfecho con las respuestas anteriores, solo pregunte, daré un intento.
Consulte esta pregunta para obtener más información relacionada con la "detección de nombres".
regex para un máximo de 4 espacios
Básicamente, tienes un problema en eso, efectivamente no hay personajes en existencia que no puedan formar una cadena de nombre legal.
Si todavía te estás limitando a palabras sin ä ü æ ß y otros personajes similares no estrictamente ascii.
Obtenga una copia de la tabla de caracteres UTF32 y descubra cuántos millones de caracteres válidos hay que le faltarán a su expresión regular simple.
Creo que "/ ^ [a-zA-Z ''] + $ /" no es suficiente, permitirá pasar una sola letra, podemos ajustar el rango agregando {4,20} lo que significa que el rango de letras es de 4 a 20.
Esta expresión regular es perfecta para mí.
^([ /u00c0-/u01ffa-zA-Z''/-])+$
Funciona bien en entornos php utilizando preg_match (), pero no funciona en todas partes.
Jérémie O''Co-nor
lo que creo que coincide con todos los nombres UTF-8.
Esto funcionó para mí:
+[a-z]{2,3} +[a-z]*|[/w''-]*
Esta expresión regular coincidirá correctamente con nombres como los siguientes:
Jean Claude Van Damme
nadine arroyo-rodriquez
wayne la pierre
Beverly d''Angelo
billy-bob thornton
tito puente
susan del rio
Agrupará "van damme", "arroyo-rodriquez", "d''angelo", "billy-bob", etc., así como los nombres singulares, como "wayne".
Tenga en cuenta que no prueba que el material agrupado sea en realidad un nombre válido. Como dijeron otros, necesitarás un diccionario para eso. Además, agrupará los números, por lo que si ese es un problema, es posible que desee modificar la expresión regular.
Escribí esto para analizar los nombres de una aplicación MapReduce. Todo lo que quería era extraer palabras del campo de nombre, agrupando las palabras del foo y la bar y billy-bobs en una palabra para hacer que la generación de pares clave-valor fuera más precisa.
He creado este patrón RegEx para nombres:
/^([a-zA-Z]+[/s''.]?)+/S$/
Funciona. Creo que deberías usarlo también.
Solo coincide con nombres o cadenas como:
Dr. Shaquil O''Neil Armstrong Buzz-Aldrin
No coincidirá cadenas con 2 o más espacios como:
Juan Pablo
No coincidirá cadenas con espacios finales como:
Juan Pablo
El texto de arriba tiene un espacio de finalización. Intente resaltar o seleccionar el texto para ver el espacio
Esto es lo que uso para aprender y crear tus propios patrones regex:
Lo he usado porque el nombre puede ser parte del parche de archivo.
//http://support.microsoft.com/kb/177506
foreach(array(''/'',''//','':'',''*'',''?'',''<'',''>'',''|'') as $char)
if(strpos($name,$char)!==false)
die("Not allowed char: ''$char''");
Me encontré con este mismo problema, y al igual que muchos otros que han publicado, esta no es una expresión 100% a prueba de tontos, pero funciona para nosotros.
/([/-''a-z]+/s?){2,4}/
Esto comprobará si hay guiones y / o apóstrofes en el primer y / o último nombre, así como también buscará un espacio entre el nombre y el apellido. La última parte es un poco de magia que verificará entre 2 y 4 nombres. Si tiende a tener muchos usuarios internacionales que pueden tener 5 o incluso 6 nombres, puede cambiarlo a 5 o 6 y debería funcionar para usted.
Para agregar puntos múltiples en el nombre de usuario use esta Regex:
^[a-zA-Z][a-zA-Z0-9_]*/.?[a-zA-Z0-9_/.]*$
La longitud de la cadena se puede configurar por separado.
Para mejorar la respuesta de daan:
^([/u00c0-/u01ffa-zA-Z]+/b[''/-]{0,1})+/b$
solo permite una sola ocurrencia de guión o apostrofia dentro de az y caracteres unicode válidos.
también realiza un retroceso para asegurarse de que no haya guiones ni apóstrofos al final de la cadena.
Puede neutralizar fácilmente todo el asunto de si las letras son en mayúscula o minúscula, incluso en ubicaciones inesperadas o poco comunes, al convertir la cadena en mayúsculas utilizando strtoupper () y luego verificarlo con su expresión regular.
Realmente no tengo mucho que agregar a una expresión regular que se encarga de los nombres porque ya hay algunas buenas sugerencias aquí, pero si quieres unos recursos para aprender más sobre las expresiones regulares, deberías revisar:
- Hoja de trucos de la Biblioteca Regex
- Otra hoja de trucos
- Un tutorial de expresiones regulares en los foros de DevNetwork: Parte 1 y Parte 2
- tutorial del constructor de PHP
- Y si alguna vez necesitas hacer regex para JavaScript (es un sabor un poco diferente), prueba el Kit de JavaScript , o este recurso , o la referencia de Mozilla
Rendirse. Cada regla que se te ocurra tiene excepciones en alguna cultura u otra. Incluso si esa "cultura" son frikis que les gusta legalmente cambiar sus nombres a "37eet".
Si bien estoy de acuerdo con las respuestas que dicen que básicamente no se puede hacer con expresiones regulares, señalaré que algunas de las objeciones (caracteres internacionalizados) se pueden resolver usando cadenas UTF y la clase de caracteres /p{L}
(coincide con unicode "carta").
puedes usar esto a continuación para los nombres
^[a-zA-Z''-]{3,}/s[a-zA-Z''-]{3,}$
^
inicio de la cadena
$
final de la cadena
espacio
[a-zA-Z''-/s]{3,}
aceptará cualquier nombre con una longitud de 3 caracteres o más, e incluirá nombres con ''
o -
como jean-luc
Entonces, en nuestro caso, solo aceptará nombres en 2 partes separadas por un espacio
en caso de múltiples nombres, puede agregar un /s
^[a-zA-Z''-/s]{3,}/s[a-zA-Z''-]{3,}$
si agrega espacios, entonces "Fue al mercado el domingo" sería un nombre válido.
No creo que pueda hacer esto con una expresión regular, no puede detectar fácilmente los nombres de un fragmento de texto usando una expresión regular, necesitaría un diccionario de nombres aprobados y una búsqueda basada en eso. Cualquier nombre que no esté en la lista no será detectado.
/([/u00c0-/u01ffa-zA-Z''/-]+[ ]?[*]?[/u00c0-/u01ffa-zA-Z''/-]*)+/;
Prueba esto . También puede forzar el inicio de char usando ^, y finalizar con char usando $
LAS MEJORES EXPRESIONES DE REGEX PARA NOMBRES:
- Usaré el término carácter especial para referirme a los siguientes tres caracteres:
- Dash -
- Guión ''
- Dot .
- Los espacios y los caracteres especiales no pueden aparecer dos veces seguidas (p. Ej .: - o ''. O .. )
- Recortado (sin espacios antes o después)
- De nada ;)
Nombre único obligatorio, SIN espacios, SIN caracteres especiales:
^([A-Za-z])+$
- Sierra es válido, Jack Alexander no es válido (tiene un espacio), O''Neil no es válido (tiene un carácter especial)
Nombre único obligatorio, SIN espacios, CON caracteres especiales:
^[A-Za-z]+(((/'|/-|/.)?([A-Za-z])+))?$
- Sierra es válida, O''Neil es válida, Jack Alexander es inválida (tiene un espacio)
Nombre único obligatorio, nombres adicionales opcionales , CON espacios, CON caracteres especiales:
^[A-Za-z]+((/s)?((/'|/-|/.)?([A-Za-z])+))*$
- Jack Alexander es válido, Sierra O''Neil es válido
Nombre único obligatorio, nombres adicionales opcionales , WITH espacios, SIN caracteres especiales:
^[A-Za-z]+((/s)?([A-Za-z])+)*$
- Jack Alexander es válido, Sierra O''Neil no es válido (tiene un carácter especial)
CASO ESPECIAL
Muchos dispositivos inteligentes modernos agregan espacios al final de cada palabra, por lo que en mis aplicaciones les dejo un número ilimitado de espacios antes y después de la cadena, luego lo recorte en el código subyacente. Entonces uso lo siguiente:
Nombre único obligatorio + nombres adicionales opcionales + espacios + caracteres especiales:
^(/s)*[A-Za-z]+((/s)?((/'|/-|/.)?([A-Za-z])+))*(/s)*$
Agregue sus propios caracteres especiales
Si desea agregar sus propios caracteres especiales, digamos un guión bajo _ este es el grupo que necesita actualizar:
(/'|/-|/.)
A
(/'|/-|/.|/_)
PD: si tienes preguntas, comenta aquí y recibiré un correo electrónico y responderé;)
^[A-Z][a-zA-Z ''&-]*[A-Za-z]$
Aceptará cualquier cosa que comience con una letra mayúscula, seguido de cero o más de cualquier letra, espacio, guión, signo y apóstrofes, y que termine con una letra.
- Nombres con guiones (Worthington-Smythe)
Agregue un - a la segunda clase de caracteres. La forma más fácil de hacerlo es agregarlo al inicio para que no pueda interpretarse como un modificador de rango (como en az
).
^[A-Z][-a-zA-Z]+$
- Nombres con Apostophies (D''Angelo)
Una forma ingenua de hacer esto sería como la anterior, dando:
^[A-Z][-''a-zA-Z]+$
¡No olvide que puede necesitar escaparse dentro de la cuerda! Una forma "mejor", dado su ejemplo, podría ser:
^[A-Z]''?[-a-zA-Z]+$
Lo cual permitirá un posible apóstrofo individual en la segunda posición.
- Names with Spaces (Van der Humpton) - mayúsculas en el medio que pueden o no ser necesarias va más allá de mi interés en esta etapa.
Aquí estaría tentado de hacer nuestro ingenuo camino de nuevo:
^[A-Z]''?[- a-zA-Z]+$
Una forma potencialmente mejor podría ser:
^[A-Z]''?[- a-zA-Z]( [a-zA-Z])*$
Que busca palabras adicionales al final. Probablemente esta no sea una buena idea si intenta hacer coincidir nombres en un cuerpo de texto adicional, pero, de nuevo, el original tampoco lo habría hecho bien.
- Nombres comunes (Ben & Jerry)
En este punto, ¿ya no estás mirando nombres individuales?
De todos modos, como puede ver, las expresiones regulares tienen el hábito de crecer muy rápido ...
- Prueba esto:
/^([A-Z][a-z]([ ][a-z]+)([ ''-]([&][ ])?[A-Z][a-z]+)*)$/
- Demostración: http://regexr.com/3bai1
Que tengas un buen día !