亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 PHP 中驗證多語言名稱?

如何在 PHP 中驗證多語言名稱?

PHP
嚕嚕噠 2023-09-15 17:28:43
我正在使用 PHP 構建一個全球網站,我希望用戶能夠用自己的語言輸入他們的名字和姓氏,而不僅僅是英語,例如:印度人將能夠用印度字母輸入他們的名字,俄羅斯人將能夠輸入他們的名字能夠用俄語字母輸入他們的名字,等等?,F在,我允許名字和姓氏僅包含字母。所以我的問題是我應該如何驗證名稱?我的意思是:我應該如何檢查這些名稱是否僅由字母組成?如果我只有英文名字,它會是這樣的:preg_match('/[^A-Za-z]/', $fname.$lname),但現在我不僅有英文字母。注意:我無法為每種不同的語言及其字母一次又一次地編寫此驗證公式。感謝您到目前為止閱讀這個問題。有任何想法嗎??
查看完整描述

1 回答

?
慕娘9325324

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@本@?”?他/她有使用奇怪名字的自由,如果那是他們真正想要的。


查看完整回答
反對 回復 2023-09-15
  • 1 回答
  • 0 關注
  • 132 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號