2012-05-08 26 views
6

que necesito una expresión regular para PHP para hacer lo siguiente:

Quiero permitir [a- zα-ωá-źá-я ա-ֆ ჰ-ჰ א-ת) y letras chinas, japonesas (más utf-8); Quiero prohibir [^] (números árabes);

Esto es lo que he hecho:

function isValidFirstName($first_name) { 
    return preg_match("/^(?=[a-zα-ωá-źа-яա-ֆა-ჰא-ת]+([a-zα-ωá-źа-яա-ֆა-ჰא-ת' -]+)?\z)[a-zα-ωá-źа-яա-ֆა-ჰא-ת' -]+$/i", $first_name); 
} 

Parece que funciona, pero si escribo cartas de más de 1 idioma, que no valida.

Ejemplos: Авпа Вапапва á-ź John - no valida. John Gger - valida, á-ź á-ź - valida.

Me gustaría todo esto.

O si hay una forma, hacer eco de un mensaje si el usuario ingresó más cadena lingual.

+1

¿Qué lenguaje de programación? Importa cuando comencemos a hablar de unicode –

+0

¡Oh, lo siento! Php! – Hypn0tizeR

+0

ver la función php 'ctype_alnum' –

Respuesta

2

no puedo reproducir los casos de insuficiencia aquí (Авпа Вапапва á-ź John valida muy bien) , pero puede simplificar mucho la expresión regular: no necesita esa afirmación de anticipación:

preg_match('/^[a-zα-ωá-źа-яա-ֆა-ჰא-ת][a-zα-ωá-źа-яա-ֆა-ჰא-ת\' -]*$/i', $first_name) 

Por lo que puedo decir de los rangos de caracteres que ha proporcionado, no es necesario que excluya los dígitos porque cualquier cosa que esté fuera de estas clases de caracteres ya causará que la expresión regular falle.

Otra consideración: Si su objetivo es permitir a cualquier carta de cualquier idioma/script (más algo de puntuacion y el espacio) se puede (si estás usando cadenas Unicode) simplificar aún más que esto:

preg_match('/^\pL[\pL\' -]*$/iu', $first_name) 

Pero, en general, no trataría de validar un nombre mediante expresiones regulares (o cualquier otro medio): Falsehoods programmers believe about names.

+0

Esto funcionó muy bien! – Hypn0tizeR

2

Es posible filtrar los caracteres árabes por el control de manera followin usando expresiones regulares:

if (preg_match('/(?:[\p{Hebrew}]+)/imu', $subject)) { 
    # Successful match 
} else { 
    # Match attempt failed 
} 

explicación RegEx

<!-- 
(?i)(?:[\p{IsHebrew}]+) 

Options: case insensitive;^and $ match at line breaks 

Match the remainder of the regex with the options: case insensitive (i) «(?i)» 
Match the regular expression below «(?:[\p{IsHebrew}]+)» 
    A character in the Unicode block “Hebrew” (U+0590..U+05FF) «[\p{IsHebrew}]+» 
     Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+» 
--> 
Cuestiones relacionadas