1 回答

TA貢獻1783條經驗 獲得超4個贊
如果您想使用正則表達式來驗證名稱,則必須使用修飾符打開 Unicode 模式/u
。當處于 Unicode 模式時,PCRE 字符類不僅匹配 ASCII 字母,還包括任何語言和腳本中的字母字符。假設您使用了該類[:alpha:]
,或者在啟用 Unicode 的情況下\p{L}
該類[:alpha:]
擴展為:
$fname?=?'??????'; $lname?=?'Русский'; preg_match('/[^[:alpha:]]/u',?$fname.$lname));
這里“Russkiy”按預期驗證,但“Hindi”失敗。但為什么?印地語是一種附標文字,例如元音變音符號和固有元音靜音符作為其結構的一部分。人們可能會假設"?"
,"?"
和"?"
以上注冊為字母;然而他們沒有。它們屬于不同的類、\p{M}
或與其他字符組合的字符。然后,為了匹配 abugida-alphabet 語言(例如印度文字,包括緬甸、泰語、藏語等),我們應該使用:
preg_match('/([^\p{L}\p{M}])/u',?$fname.$lname));
我已初步驗證此組合與以下語言中預期的字母和組合標記字符匹配:阿卡德語、阿拉伯語、亞美尼亞語、希臘語、古吉拉特語、希伯來語、印地語、日語、馬拉雅拉姆語、普通話、俄語、僧伽羅語、蘇美爾語、泰米爾語、泰語。更詳盡的測試尚未完成,可以肯定地說,上面的內容將涵蓋您的大部分字母基礎。
現在,關于驗證名稱的完全與 unicode 無關的問題。我注意到您不允許名稱中包含空格。害怕“亞伯拉罕·范海辛”和“奧薩馬·本·拉登”嘗試報名的那一天。然后,你不允許經期。那“VS Achuthanandan”呢,人們叫他“Vee Es”,因為“Velikkakathu Sankaran”讓你的嘴很累。那么“JK羅琳”呢?
再次強調,不允許使用破折號。“卡里姆·阿卜杜勒-賈巴爾”和“讓-呂克·皮卡德”怎么樣?沒有適合您的職業籃球或曲速驅動器。再次強調,不允許使用撇號意味著“達達尼昂伯爵”可能會向你發起決斗挑戰,而未來可能屬于天網,因為“莎拉·奧康納”未能注冊。她不會回來了。你的網站不太酷。
又名老式鮑比桌(Bobby Tables)怎么樣?Robert'); DROP TABLE students;--
,或者埃隆·馬斯克的新生兒“X ? A-12”。在那里,我已經告訴您如何匹配任何語言中的任何字母或其片段。我還暗示,如果您允許上述所有內容,幾乎是避免誤報的基線,那么它可能與一開始就不進行檢查沒有太大區別。給出“x!1??。'/nul1 W0W@本@?”?他/她有使用奇怪名字的自由,如果那是他們真正想要的。
- 1 回答
- 0 關注
- 132 瀏覽
添加回答
舉報