2011-11-04 42 views
9

我一直在用RegEx掙扎,所以請原諒我,如果這看起來像是一個可怕的方法來解決我的問題。接受RegEx中的國際名字字符

當用戶輸入姓氏和名字我開始只使用基本的,檢查大小寫,空格,撇號和連字符

if (!preg_match("/^[a-zA-Z\s'-]+$/", $name)) { // Error } 

現在我知道這是不是最好的,因爲人們可以擁有諸如:Martin Luther King,Jr.博士(用逗號和fullstops)。所以我認爲通過改變它可以使它稍微有效一些。

if (!preg_match("/^[a-zA-Z\s,.'-]+$/", $name)) { // Error } 

我然後看到我知道在我的Facebook誰寫她的名字爲西安,這讓我思考含有變音符號,以及日本講/中國/韓國/俄文字符太名稱的女孩名字。所以我開始尋找並通過在其中寫入每個字符來找到方法。

if (!preg_match("/^[a-zA-Z\sàáâäãåèéêëìíîïòóôöõøùúûüÿýñçčšžÀÁÂÄÃÅÈÉÊËÌÍÎÏÒÓÔÖÕØÙÚÛÜŸÝÑßÇŒÆČŠŽ∂ð ,.'-]+$/u", $first_name)) { // Error } 

你可以想像,這是非常長篇大論,我敢肯定有一個更簡單的正則表達式可以做到這一點。就像我所說的,我已經四處搜尋,但這是我能做的最好的。

那麼,什麼是檢查大寫和小寫字符,逗號,句號,省略號,hypens,變音符號,拉丁語,日語/俄語等

+0

除非您先進行標準化,否則這種方法無效。 – tchrist

回答

28

您可以使用Unicode字符類的好方法。 \pL涵蓋了幾乎所有的字母符號。
http://php.net/manual/en/regexp.reference.unicode.php

if (!preg_match("/^[a-zA-Z\s,.'-\pL]+$/u", $name)) 

http://www.regular-expressions.info/unicode.html見,但要注意的是PHP/PCRE既懂縮寫類名。

+0

+1擊敗我:) – FailedDev

+0

非常感謝你,爲什麼我不能早點找到這個,哈!你能告訴我你縮寫的類名是什麼意思嗎? – Joe

+0

@HelloJoe:這不是最明顯的特徵。只在PHP手冊中找到文檔很晚。縮略語:例如,PCRE只支持'\ p {L}'而不是'\ p {Letter}'或'\ p {Russian}'。 – mario

2

允許其他類型的標點符號可能會導致資格的一些鬆動。

有一點應該是限制,至少需要一個字母。
修改Mario的正則表達式有點:

if (!preg_match("/^(?:[\s,.'-]*[a-zA-Z\pL][\s,.'-]*)+$/u", $name))

7

\pL已經包括a-zA-Z,因此所提到的圖案"/^[a-zA-Z\s,.'-\pL]+$/u"可以簡化爲

"/^[\s,.'-\pL]+$/"

也改性劑u不是必需的。

+4

儘管由於提到'a-zA-Z'是多餘的,我最初打算+1,但我必須提到'u'修飾符是必需的,否則PHP不會支持多字節編碼。 – dotancohen

+0

我在我的DEV機器上測試過它,它對我沒有'u'修飾符的事件起作用 – staabm

+0

你使用的是UTF-8或其他多字節編碼,還是單字節編碼,如ASCII或latin1?對於單字節編碼,「u」修飾符不是必需的。 – dotancohen