2012-05-08 68 views
6

我需要一個正則表達式 PHP 做到以下幾點:

我想允許[A- zα-ωá-ź-яա-ֆ-ჰ-ჰ-ת-ת]和中文,日文(更多utf-8)字母; 我要禁止[^](阿拉伯數字);

這是我做了什麼:

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

它看起來像它的工作原理,但如果我輸入的1種多語言的字母,它不驗證。

例子:АвпаВапапваA-Z約翰 - 不驗證。 John Gger - 驗證, - 驗證。

我想這一切的這些。

或者,如果有一種方法,如果要用戶輸入更多的語言字符串呼應的消息。

+1

什麼編程語言?當我們開始談論unicode –

+0

時很重要哦,我很抱歉! PHP的! – Hypn0tizeR

+0

看到php函數'ctype_alnum' –

回答

2

我不能在這裏重現失敗的情況下(Авпа Вапапва á-ź John驗證就好了) ,但可以簡化正則表達式很多 - 你不需要是前向斷言:

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

據我可以告訴從字符範圍你給了,你不需要排除數字,因爲這些字符類以外的任何東西都已經引起了正則表達式失敗。

另一個要考慮的:如果你的目標是允許從任何語言/文字的任何字母(加上一些標點符號和空格),您可以(如果你使用Unicode字符串)進一步簡化這:

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

但通常,我不會嘗試通過正則表達式(或任何其他方式)驗證名稱:Falsehoods programmers believe about names

+0

這很好用! – Hypn0tizeR

2

您可以通過使用正則表達式檢查跟隨着的方式過濾掉阿拉伯字符:

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

正則表達式的解釋

<!-- 
(?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) «+» 
--> 
相關問題