如何验证ASP .NET MVC中的名称,允许重音(é,á,...)?

时间:2011-08-09 16:47:32

标签: c# regex asp.net-mvc

我需要验证表单'name'字段,其中可能包含带有重音符号的字符,例如á,é等。

我尝试在另一个SO问题中指示在以下属性中应用正则表达式(道歉我现在找不到),并且正确地验证了我不想要的大多数字符(即*,^, ?)它也将重音字符标记为无效。

这是因为我在客户端验证而不是服务器吗?

任何建议都将受到赞赏。

[ValidateRegExp(@"^\w*$", "Invalid characters in surname")]

4 个答案:

答案 0 :(得分:9)

我不会给你正则表达式,因为你真的不应该验证人的名字 这是容易出错的之一,offend your users

无论如何,这有什么好处?
你可能做的最粗鲁的事情是说类似于“姓氏中的无效字符”。我的姓是Абрамов,字符完全有效,只是你的系统不够智能。用户界面不应该因你的错误而责怪我。

如果接受此类字符确实会破坏您的数据库,请至少回复“我们非常抱歉,但我们的系统不接受任何英文字母。”

通过Patrick看看这篇精彩的帖子:

Falsehoods Programmers Believe about Names

  
      
  1. 人们只有一个规范的全名。
  2.   
  3. 人们只有一个全名。
  4.   
  5. 此时,人们只有一个规范的全名。
  6.   
  7. 在这个时间点,人们有一个他们经过的全名。
  8.   
  9. 对于任何N值,人们都有N个名字。
  10.   
  11. 人们的名字符合一定数量的空间。
  12.   
  13. 人们的名字不会改变。
  14.   
  15. 人们的名字会发生变化,但仅限于某些枚举事件。
  16.   
  17. 人们的名字是用ASCII编写的。
  18.   
  19. 人们的名字是用任何单个字符集编写的。
  20.   
  21. 人们的名字都映射在Unicode代码点中。
  22.   
  23. 人们的名字区分大小写。
  24.   
  25. 人们的名字不区分大小写。
  26.   
  27. 人们的名字有时会有前缀或后缀,但你可以放心地忽略它们。
  28.   
  29. 人名不包含数字。
  30.   
  31. 人们的名字不是全部大写的。
  32.   
  33. 人们的姓名不是全部用小写字母书写的。
  34.   
  35. 人们的名字是他们的命令。选择任何排序方案将自动导致所有系统之间的一致排序,只要两者对同一名称使用相同的排序方案即可。
  36.   
  37. 人们的名字和姓氏必然是不同的。
  38.   
  39. 人们有姓氏,姓氏,或其他被公认为亲属的人分享的名字。
  40.   
  41. 人们的名字是全球唯一的。
  42.   
  43. 人们的名字几乎是全球唯一的。
  44.   
  45. 好吧,但是人们的名字肯定是多种多样的,以至于没有一百万人拥有相同的名字。
  46.   
  47. 我的系统永远不会处理来自中国的名字。
  48.   
  49. 或日本。
  50.   
  51. 或韩国。
  52.   
  53. 或爱尔兰,英国,美国,西班牙,墨西哥,巴西,秘鲁,俄罗斯,瑞典,博茨瓦纳,南非,特立尼达,海地,法国或克林贡帝国,所有这些都有“奇怪”的命名常用方案。
  54.   
  55. 克林贡帝国的事情是个玩笑,对吗?
  56.   
  57. 混淆你的文化相对主义!至少,我的社会中的人们同意一个普遍接受的名称标准。
  58.   
  59. 存在一种转换名称并且可以无损地反转的算法。 (是的,是的,如果你的算法返回输入,你可以这样做。你得到一颗金星。)
  60.   
  61. 我可以放心地假设这个坏词词典里面没有人的名字。
  62.   
  63. 人们的名字是在出生时分配的。
  64.   
  65. 好吧,也许不是在出生时,但至少非常接近出生。
  66.   
  67. 好的,好的,在出生后的一年左右。
  68.   
  69. 五年?
  70.   
  71. 你在跟我开玩笑吧?
  72.   
  73. 包含同一个人数据的两个不同系统将使用该人员的相同名称。
  74.   
  75. 如果系统设计良好,两个不同的数据输入操作符(根据人名)必须在任何单个系统上输入按位等效字符串。
  76.   
  77. 名字破坏我的系统的人是奇怪的异常值。他们应该拥有坚实,可接受的名字,比如田中太郎。
  78.   
  79. 人们有名字。
  80.   

答案 1 :(得分:3)

  • \p{L}\p{Letter} =识别为字母的任何unicode字符。
  • \p{N}\p{Number} =任何识别为数字的unicode字符。

更多变种:http://www.regular-expressions.info/unicode.html#prop

[ValidateRegExp(@"^[\p{L}\p{N}]*$", "Disallowed characters in surname")]

答案 2 :(得分:0)

尝试使用此字符集:[a-zA-ZÀ-ÿ0-9]。第三个范围将匹配所有重音字符。

[ValidateRegExp(@"^[a-zA-ZÀ-ÿ0-9]*$", "Invalid characters in surname")]

答案 3 :(得分:0)

如何完全避免正则表达式并使用类似的东西:

s.All(c=>char.IsLetter(c))

您还应该先normalize the string。因此,您可以处理重音字符,基本字符和重音位于不同的char s。