用于外国名称的 Javascript 正则表达式

Javascript regex for foreign names

本文关键字:Javascript 正则表达式 用于      更新时间:2023-09-26

我做了一个简单的正则表达式来验证名称,我没有想到的是,一些用户有两个(或更多不常见的名称(,并且他们有像áéióú这样的口音。

我也在考虑其他字符,如西班牙语 ñ 或 ç。

到目前为止,这是我的验证代码:

function validateForm(element) {
    var regex =  /^[a-zA-Z'-]+$/;
         var ctrl =  document.getElementById(element).value;
        if(ctrl == null || ctrl == '')
            return;
         if (!regex.test(ctrl)) {
         alert(element + ' not valid');
         document.getElementById(element).focus();
}
我不知道

该怎么做,有什么提示吗?

我不打算引用整个 Falsehoods Programmers Believe About Names,但足以说明一个简单的正则表达式无法准确捕获人名的复杂性。

对于您提出的每条规则,肯定会有数百个例外。无论是它的"名字不能有空格"除了">范布伦",名字除了奥莱利只有字母,名字除了">麦克唐纳"只有一个大写字母,等等,甚至一个人都会有名字和姓氏除了"雪儿"、"王子"、"波诺"等......

如第一条评论所述,名称唯一可能的正则表达式是:

/^.+$/

而且事件很麻烦,因为它暗示一个名字甚至有一个书面形式开始。


为了后代,我将在此处包含文章中的虚假列表:

程序员相信名字的谎言

  1. 人们只有一个规范的全名。
  2. 人们只有一个全名。
  3. 在这个时间点,人们只有一个规范的全名。
  4. 在这个时间点,人们有一个全名。
  5. 对于 N 的任何值,人们正好有 N 个名字。
  6. 人们的名字适合一定定义的空间量。
  7. 人们的名字不会改变。
  8. 人们的名字会改变,但只是在某个枚举的事件集中。
  9. 人们的名字是用ASCII写的。
  10. 人们的名字以任何单个字符集书写。
  11. 人们的名字都映射到 Unicode 代码点中。
  12. 人员姓名区分大小写。
  13. 人名不区分大小写。
  14. 人们的名字有时有前缀或后缀,但您可以安全地忽略它们。
  15. 人名不包含数字。
  16. 人们的名字不是全部大写的。
  17. 人们的名字不是全部用小写字母写的。
  18. 人们的名字对他们有顺序。 选择任何排序方案将自动导致所有系统之间的排序一致,只要两者都对同一名称使用相同的排序方案。
  19. 人们的名字和姓氏必然是不同的。
  20. 人们有姓氏、姓氏或任何其他被公认为其亲属的人共享的东西。
  21. 人们的名字是全球唯一的。
  22. 人们的名字几乎是全球独一无二的。
  23. 好吧,但可以肯定的是,人们的名字足够多样化,以至于没有一百万人共享同一个名字。
  24. 我的系统永远不必处理来自中国的名字。
  25. 或者日本。
  26. 或者韩国。
  27. 或者爱尔兰、英国、美国、西班牙、墨西哥、巴西、秘鲁、俄罗斯、瑞典、博茨瓦纳、南非、特立尼达、海地、法国或克林贡帝国,所有这些都有常用的"奇怪"命名方案。
  28. 克林贡帝国的事情是个笑话,对吧?
  29. 混淆你的文化相对主义! 至少,在我的社会中,人们同意一个普遍接受的名字标准。
  30. 存在一种可以转换名称并且可以无损反转的算法。 (是的,是的,如果您的算法返回输入,您可以这样做。 你会得到一颗金星。
  31. 我可以有把握地假设这本坏词词典中不包含人名。
  32. 人们的名字是在出生时分配的。
  33. 好吧,也许不是在出生时,但至少在出生时非常接近。
  34. 好吧,好吧,出生后一年左右。
  35. 五年?
  36. 你在跟我开玩笑吧?
  37. 包含同一人数据的两个不同系统将为该人使用相同的名称。
  38. 如果系统设计良好,则给定一个人的名字的两个不同的数据输入运算符必然会在任何单个系统上输入按位等效字符串。
  39. 那些名字破坏我系统的人是奇怪的异常值。 他们应该有坚实的、可接受的名字,比如田中太郎。
  40. 人是有名字的。

名称很难验证,因为它们差异很大。正如您所指出的,名称可以连字符,空格分隔或包含大多数英语名称没有的脚本,这使得考虑所有可能性几乎是不可能的。

话虽如此...

有一些简单的事实适用于任何名称,无论是外国名称还是其他名称,我们可以测试这些条件。

以下是您可能想要也可能不想排除的一些内容。

  • 为空的名称
  • 包含数字的名称
  • 包含无意义字符的名称(数字、+ _ ! @ # $ % ^ & * 等(
  • 以特殊字符(如空格、连字符和撇号(开头或结尾的名称
  • 包含连续的、相同的特殊字符的名称(例如 -- 或 -'(
  • 可能还有更多我没有提到的(如果你想到任何评论,请发表评论,我做了很多这种验证,并且会热衷于其他人的意见(

注意: 我所说的特殊字符是指"伪字母数字"符号,例如连字符,空格,撇号 - 名称中允许但不是字母数字的东西。

我的建议是为要测试的每个条件运行单独的正则表达式,并仅在所有条件都通过时才接受该名称。 单独执行此操作还可以让您更有能力确定究竟是什么原因导致输入的名称无效。

我有大约 15,000 个用户使用类似的限制性验证构建的东西,我从来没有遇到过这种方法的问题。

编辑:很明显,我对这个问题的方法可能会排除名字中有数字或符号的人。你施加的条件越多,这些人就越会给你带来不便。


请忽略此行上方的所有内容

进入这个问题,我诚实

而谦虚的观点是,从名称中验证"垃圾"是明智的,因此我觉得删除我原来的答案是不诚实的。

我仍然推荐它作为一种技术来验证更统一的输入,并具有更明确的标准,如日期、时间、本地电话号码。

相反,我想说,在评论中辩论并阅读了其他答案之后,我也得出的结论是,您不应该对姓名施加任何条件。

只要你在输入进入数据库之前对其进行清理,任何事情都会发生,这不是我的事,我什至不知道我为什么要关心。

现在,如果您原谅我,我有一些代码要修复...