2012-05-08 22 views
6

muszę Regex dla PHP wykonać następujące czynności:

chcę pozwolić [A- zα-ω--а-я ա-ֆ ა-ჰ א-ת] i chińskie, japońskie (więcej utf-8) liter; Chcę zablokować [^] (cyfry arabskie);

To co zrobiłem:

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

Wygląda jak to działa, ale jeśli mogę wpisać litery więcej niż 1 język, to nie sprawdza.

Przykłady: Авпа Вапапва á-ź John - nie sprawdza. John Gger - waliduje, á-ź á-ź - sprawdza poprawność.

Chciałbym to wszystko.

Lub jeśli istnieje sposób, aby wyświetlić komunikat, jeśli użytkownik wprowadził więcej ciągów językowych.

+1

Jaki język programowania? To ma znaczenie, kiedy zaczynamy rozmawiać o Unicode –

+0

Och, przepraszam! Php! – Hypn0tizeR

+0

zobacz funkcję php 'ctype_alnum' –

Odpowiedz

2

I nie można odtworzyć tu przypadki awarii (Авпа Вапапва á-ź John sprawdza dobrze) , ale możesz znacznie uprościć wyrażenie regularne - nie potrzebujesz tego potwierdzenia z wyprzedzeniem:

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

O ile wiem z podanych zakresów znaków, nie ma potrzeby wykluczania cyfr, ponieważ wszystko poza tymi klasami znaków spowoduje już niepowodzenie regex.

Innym zjawiskiem: Jeśli twoim celem jest, aby umożliwić dowolną literę z każdego języka/skryptu (plus niektóre znaki interpunkcyjne i przestrzeni) można (jeśli używasz ciągów znaków Unicode) dalsze uproszczenie tego:

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

Generalnie jednak nie próbowałbym sprawdzać nazwy za pomocą wyrażeń regularnych (lub w jakikolwiek inny sposób): Falsehoods programmers believe about names.

+0

To działało świetnie! – Hypn0tizeR

2

można odfiltrować znaki arabskie sprawdzając followin sposób przy użyciu regex:

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

RegEx wyjaśnienie

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