2012-05-08 1 views
6

ho bisogno di un Regex per PHP per effettuare le seguenti operazioni:

voglio permettere [a- zα-ωá-źа-я ա-ֆ ა-ჰ א-ת] e lettere cinesi, giapponesi (più utf-8); Voglio vietare [^] (numeri arabi);

questo è quello che ho fatto:

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

sembra che funziona, ma se digito lettere di più di 1 lingua, non convalida.

Esempi: Авпа Вапапва á-ź John - non convalida. John Gger - convalida, á-ź á-ź - convalida.

Mi piacerebbe tutto questo.

O se c'è un modo, per echo un messaggio se l'utente ha inserito più stringhe linguali.

+1

Quale linguaggio di programmazione? Importa quando iniziamo a parlare di unicode –

+0

Oh mi dispiace! Php! – Hypn0tizeR

+0

vedere la funzione php 'ctype_alnum' –

risposta

2

non riesco a riprodurre le casi di insufficienza qui (Авпа Вапапва á-ź John convalida bene) , ma puoi semplificare molto la regex - non hai bisogno di quell'asserzione lookahead:

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

Per quanto posso dire dalle gamme di caratteri che hai fornito, non è necessario escludere le cifre perché qualsiasi cosa al di fuori di queste classi di caratteri causerà già un errore nella regex.

Un'altra considerazione: Se il vostro obiettivo è quello di consentire a qualsiasi lettera da qualsiasi linguaggio/script (più alcuni segni di punteggiatura e lo spazio) è possibile (se si sta utilizzando stringhe Unicode) semplificare ulteriormente questo:

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

Ma in generale, non proverei a convalidare un nome con espressioni regolari (o con qualsiasi altro mezzo): Falsehoods programmers believe about names.

+0

Questo ha funzionato alla grande! – Hypn0tizeR

2

Si può filtrare i caratteri arabi controllando modo followin utilizzando RegEx:

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

RegEx spiegazione

<!-- 
(?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) «+» 
-->