2011-11-04 26 views
9

Siempre he tenido problemas con RegEx, así que discúlpeme si esto puede parecer un enfoque horrible para abordar mi problema.Aceptar caracteres de nombre internacional en RegEx

Cuando los usuarios están entrando nombres y apellidos Empecé simplemente utilizando la básica, la verificación de mayúsculas y minúsculas, espacios en blanco, apóstrofes y guiones

if (!preg_match("/^[a-zA-Z\s'-]+$/", $name)) { // Error } 

Ahora me doy cuenta de que esto no es el mejor desde la gente podría tener cosas como: Dr. Martin Luther King, Jr. (con coma y fullstops). Así que supongo que al cambiarlo esto lo haría un poco más efectivo.

if (!preg_match("/^[a-zA-Z\s,.'-]+$/", $name)) { // Error } 

entonces vi un nombre de chicas que conozco en mi Facebook que escribe su nombre como Sian, que me hizo pensar de los nombres que contienen diéresis, así como dicen los caracteres japoneses/chino/coreano/ruso también. Así que comencé a buscar y encontré formas escribiendo cada uno de estos caracteres como tal.

if (!preg_match("/^[a-zA-Z\sàáâäãåèéêëìíîïòóôöõøùúûüÿýñçčšžÀÁÂÄÃÅÈÉÊËÌÍÎÏÒÓÔÖÕØÙÚÛÜŸÝÑßÇŒÆČŠŽ∂ð ,.'-]+$/u", $first_name)) { // Error } 

Como se puede imaginar, es extremadamente largo aliento y estoy bastante seguro de que es una expresión regular mucho más simple que se puede lograr esto. Como he dicho, he buscado, pero esto es lo mejor que puedo hacer.

Por lo tanto, lo que es una buena manera de comprobar los caracteres en mayúsculas y minúsculas, comas, puntos, apóstrofes hypens, diéresis, América, japonés/ruso etc

+0

Eso NO FUNCIONARÁ a menos que se normalice primero, y con frecuencia ni siquiera entonces. – tchrist

Respuesta

28

Puede utilizar una clase de caracteres Unicode. \pL cubre prácticamente todos los símbolos de letras.
http://php.net/manual/en/regexp.reference.unicode.php

if (!preg_match("/^[a-zA-Z\s,.'-\pL]+$/u", $name)) 

Ver también http://www.regular-expressions.info/unicode.html, pero ten en cuenta que PHP/PCRE sólo entiende los nombres de las clases abreviadas.

+0

+1, pásame al grano :) – FailedDev

+0

Ah, muchas gracias, ¿por qué no pude encontrar esto antes, ¡ja! ¿Podrías decirme qué quieres decir con nombres de clase abreviados? – Joe

+0

@HelloJoe: no es la característica más obvia. Solo encontré la documentación en el manual de PHP bastante tarde. Abreviaturas: PCRE solo admite '\ p {L}' not '\ p {Letter}' o '\ p {Russian}' por ejemplo. – mario

2

Probablemente haya algún aflojamiento de las calificaciones al permitir otros tipos de puntuación.

Una cosa que debería ser una restricción es requerir al menos una letra.
expresión regular de Modificación de Mario un poco:

if (!preg_match("/^(?:[\s,.'-]*[a-zA-Z\pL][\s,.'-]*)+$/u", $name))

7

\pL ya incluye a-z y A-Z, por lo tanto el patrón mencionado "/^[a-zA-Z\s,.'-\pL]+$/u" podría simplificarse en

"/^[\s,.'-\pL]+$/"

Tampoco se requiere el modificador u.

+4

Aunque inicialmente tenía la intención de hacer +1 debido a la mención de que' a-zA-Z' era redundante, debo mencionar que el modificador 'u' es ciertamente necesario ya que de lo contrario PHP no lo hace admitir codificaciones multibyte. – dotancohen

+0

Lo probé en mi máquina DEV y funcionó para mí evento sin el modificador 'u' – staabm

+0

¿Estaba usando un UTF-8 u otra codificación multibyte, o una codificación de un solo byte como ASCII o latin1? El modificador 'u' no es necesario para codificaciones de un solo byte. – dotancohen

Cuestiones relacionadas