2012-02-25 147 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