2012-02-25 145 views
3

我想製作一個檢查有效名稱的JavaScript正則表達式。JavaScript正則表達式有效名稱

  • 最低2個字符(空間不能算)
  • 空間連接允許一些特殊字符(éàëä ...)

我知道如何寫一些seperatly但不結合。

如果我使用/^([A-Za-z éàë]{2,40})$/,用戶可以輸入2位的名字

如果我使用/^([A-Za-z]{2,40}[ éàë]{0,40})$/,用戶必須首先使用空格或特殊字符後,用2個字母,不能再使用字母。

搜索了一下,但很難爲我的問題制定搜索字符串。有任何想法嗎?

+2

Sooo,有什麼會發生你不允許在他們的名字字符? – loganfsmyth 2012-02-25 15:34:41

+0

@loganfsmyth他們得到一個新的名字;) – 2012-02-25 15:38:37

+1

http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/ – pawel 2013-10-21 08:11:32

回答

1

爲什麼不

var reg= /^([A-Za-z]{2}[ éàëA-Za-z]*)$/; 

2個字母,然後儘可能多的空間,字母或特殊字符,只要你想。

我不會允許在用戶名空間,但 - 它找麻煩,當你有一個像

ab   ba 

用戶名誰去記住他們多少空間使用?

+0

其實填寫表格,並用於檢查姓氏。由於有很多姓氏在他們的空間,我想包括他們。但是正如你指出的那樣,你的腳本可以連續使用很多空格。 是否有一個簡單的解決方案,允許一次只允許一個空格,因此您可以使用一個姓氏:van den borre(並且仍然拒絕van den borre的名字)? Thx爲答案allready :) – user1232673 2012-02-25 15:56:33

1

你可以這樣做:

/^([A-Za-zéàë]{2,40} ?)+$/ 

2-40個字符,然後任選一個空間,至少重複一次。這將在最後留出空間,但您可以分開修剪它。

+0

如果你想擺脫正則表達式本身的空間,使用一個非捕獲組。 '/ ^(?:([A-Za-zéàë] {2,40})?)+ $ /' – loganfsmyth 2012-02-25 15:42:11

+0

@loganfsmyth我的意思是將正則表達式(例如'test')應用於類似''的字符串bob barker「'會導致'true',在那裏你可能希望它是'false',因爲最後的空間。 – 2012-02-25 16:27:31

+0

哦,是的,我一定誤會了:P Oops – loganfsmyth 2012-02-25 17:30:07

8

請不要這樣做。通過告訴他們他們的名字無效,你最終只會使人們感到不安。姓氏的幾個例子將被您的方案拒絕:O'Neill,Sørensen,Юдович,。試圖涵蓋所有這些情況和更多是註定要失敗的。

就做這樣的事情:

  • 條前端和後端的空白
  • 崩潰連續坯成一個空間
  • 檢查,如果結果不是空

在JavaScript中,看起來像:

name = name.replace(/^\s+/, "").replace(/\s+$/, "").replace(/\s+/, " "); 
if (name == "") { 
    // show error 
} else { 
    // valid: maybe put trimmed name back into form 
} 
0

「修剪」輸入值後,以下內容將僅針對拉丁姓氏計算您的請求。

rn = new RegExp("([\w\u00C0-\u02AB']+ ?)+","gi"); 
m = ln.match(rn); 
valid = (m && m.length)? true: false; 

請注意,我用的「+」,而不是「{2}」,這是因爲有些姓氏僅使用一個字母在單獨的詞,如「奧爾特加·加塞特」

你可以看到我沒有使用RegExp.test,這是因爲這種方法無法正常工作(我不知道爲什麼,但是它有很高的失敗率,你可能會看到它here:

在我的國家,非拉丁語國家的人通常會翻譯他們的名字,所以以前的RegExp就足夠了。但是,如果您嘗試匹配世界上的任何姓氏,您可以添加更多範圍\ ####個字符,避免包含符號,數字或其他類型。或者也許xregexp圖書館可能會幫助你。

而且,請不要忘記測試中服務器端的輸入,並在SQL語句使用它之前逃脫它(如果有的話)

2

我想提出一個正則表達式會匹配所有基於拉丁文的語言與他們的特殊字符:

/\A([ áàíóúéëöüñÄĞİŞȘØøğışÐÝÞðýþA-Za-z-']*)\z/ 

PS我已經包含了所有可以找到的角色,但如果我錯過了任何內容,請隨時編輯答案。

4

大多數解決方案不考慮可能存在的許多不同名稱。可以有隻有兩個字符的名稱,如AlBo或某人寫他的名字,如F.中間名姓氏

RegExp將驗證大多數名字,但你可以優化它到任何你想要的:

/^[a-z\u00C0-\u02AB'´`]+\.?\s([a-z\u00C0-\u02AB'´`]+\.?\s?)+$/i 

這將使:

  • 李黃武
  • Cevahir酒店Özgür的
  • Yiğit艾登
  • FinlayÞunorBoivin
  • 蘇埃米克諾里斯
  • 塔蒂亞娜的Zlata Zdravkov
  • ARIADNA Eliisabet O'Taidhg
  • 謝爾蓋利西特rijnders
  • BRIANA NORMINA奧普特
  • BihOtZ阿蒙巴甫洛夫
  • 默多銳衡Stanek的
  • Filimena J.範Der Veen
  • D.布萊爾華萊士

但將允許:

如果該名稱必須大寫,大寫,小寫,修整或單倍行距,這是一個任務格式化應該做的,而不是用戶。

+0

我相信這對於那些只想拉丁字母的人來說是最好的選擇。我只加了一句聖地亞哥的正則表達式:'/^[az\u00C0-\u02AB''\'-]+\.?\s([az\u00C0-\u02AB''\'-]+\.?\s ?)+ $/i'。另外,可以使用關於unicode字符的相同方法來添加其他可能性。順便說一句,我用它在JavaScript中。 – 2016-09-28 13:38:41

+0

更新版本(更靈活一些):https://gist.github.com/stgogm/32b54c4a5d00e73dedb2 – 2017-04-27 14:16:41