【问题标题】:Validating a prename and surname [closed]验证前名和姓氏[关闭]
【发布时间】:2013-11-04 23:51:17
【问题描述】:

我想验证用户名和姓氏,以便在全球社交社区中注册。

我想允许所有这些与语言相关的特殊字符,如 ÄÖÜÀýéè最多 3 个前缀,全部用空格分隔(如果有超过1 个名字)。 也不应允许使用下划线或其他特殊字符,但应允许使用减号 (-)。

这就是我能想到的名称中应该允许的所有内容。我不知道在德国以外的其他国家情况如何,但在这里你最多可以有 3 个姓氏,一个姓氏也可以有 2 个单词,比如“von Seidenfeld”。 也许你也可以在这里给我更多的建议,因为我想为世界各地的每个全名介绍这个名称验证系统。

我也知道我必须使用 RegEx,但我不知道如何只允许我刚刚编写的这些条件。

到目前为止我所拥有的:

if (!preg_match('/^(\pL+\s+)$/u', $value)) echo 'error';

或在此处查看:http://regex101.com/r/tE0uQ5(遗憾的是不起作用,没有匹配项)

【问题讨论】:

  • 简短回答:您可能不想进入这个兔子洞。长答案:kalzumeus.com/2010/06/17/…
  • @David 哦,好吧。所以你有什么建议? Facebook 是如何做到的?
  • Facebook 会这样做吗? Facebook到底是做什么的?几年前我第一次注册 Facebook 时,我的“名字”是“Turbocharged Monkeybrain”。工作正常。
  • @David 按照标准命名约定,这在技术上是完全有效的名字和姓氏。另外,喜欢这个链接。我在我的网站上发布了同样的内容,还没有看到你的。
  • 我认识一个大学同学,英文名是Z

标签: php regex


【解决方案1】:

这就是我能想到的名称中应该允许的所有内容。

甚至没有接近。

我不知道在德国以外的其他国家是怎样的,但在这里你最多可以有 3 个姓氏,一个姓氏也可以有 2 个单词,比如“von Seidenfeld”。

在其他国家不同。在德国可能也有所不同,只是不是因为你的名字或你此刻立即想到的人的名字。

我想为世界各地的每个全名介绍这个名称验证系统。

This 应该是该主题的必读内容。但总而言之......没有办法做到这一点。没有。如果您绝对需要一个匹配名称的正则表达式,this might help

根据定义,任何人以他们的名字进入你的系统就是他们的名字,至少就你的系统而言。这就是他们决定你应该识别他们的方式。这是他们在其管辖范围内的法定名称吗?在你的管辖范围内?这是他们父母给他们起的名字吗?他们的朋友叫他们什么名字?这些东西都不能通过正则表达式进行验证。

简而言之...只要接受任何非空输入作为名称即可。

【讨论】:

  • 是的,我刚刚阅读了你给我的链接。没有想到这一点。但是特殊字符和数字呢?
  • 想给 +10 但 SO 只允许 1
  • @Vay:角色在纯粹主观意义上是“特殊的”。仅仅因为一个字符不是罗马字母或日耳曼字母的一部分并不能使它“特别”。说真的,没有其他方式可以描述这一点。无数开发人员和产品所有者无数次尝试过它。解决问题的唯一方法是从一开始就不将其视为问题。
  • @Vay 感叹号! 在某些非洲语言中被读作点击,在名称中间有效。所以不,甚至不能假设标点符号。
  • 你们知道名字的大写吗?所以第一个字母是大写的。这会影响任何语言吗?
【解决方案2】:

我建议寻找无效字符而不是有效字符,以简化事情:

^((?:(?:(?<!^)[ ])?[^*&@_#$\]\\\^\d ]+){1,3})$

我不得不转义末尾的 4 个特殊字符(]、\、^、-)。还添加了 \d 以过滤掉数字。

在这里查看它的实际效果! http://regex101.com/r/vY9wW5

我打赌没有人再关心了,但我让这只小狗工作了。问题是我意识到应该如何转义 PHP 字符串(使用单引号,只需将转义的反斜杠加倍),并且正则表达式测试人员和在线 ide 可能以微妙的方式弄乱了我的字符串。

<?php
$sourcestring="Uwe\nUwe-Jens\nGünther Kalle\nKalle Jens Chantal";
$regex = '((?:(?:(?<!^)[ ]|(?<=(?<=^|\n)))[^*&@_#$\]\\\\\^\d \n]+){1,3}(?=\n|$))';
preg_match_all($regex,$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>

也就是说,我认为有些情况下名称带有奇怪的符号,例如非常罕见的数字和符号,您可以让它们绕过现实检查过滤器,以换取能够过滤掉按钮破坏者来自您的登录过程。

【讨论】:

  • 您的代码出现错误:regex101.com/r/yG3cE9
  • 已修复,可与该测试人员一起使用。虽然还不完美,但足以验证您的姓名列表。
  • 现在可以与测试仪一起使用,但不能在我的代码中使用。我试过了:if (preg_match('^([^&amp;@*#_$\]\\\^\d]+( [^*&amp;@_#$\]\\\^\d]+){0,2})$/u',$value))。我得到:警告:preg_match():未知修饰符'&'
  • 抱歉,对RegEx不太了解
  • 您底部的代码(现在)在我的代码中似乎不起作用。我可以用@#等输入名字。
【解决方案3】:

如果是国际名称,则忘记名称验证。举个例子,这是一个完全有效的匈牙利名字:

dr. Lakatosné Dr. Bíró-Kis Imola

Imola 是给定的名字,其余的是姓氏,只是为了混淆一些东西。祝你好运验证任何事情。如果您想要更多令人头疼的例子,请以艺术家为例,例如法律允许他们注册艺术家姓名,这将成为其官方名称的一部分。

一般来说,名字有不同的来源,例如一些文化习惯于总是加上父亲的名字以及附加自己的名字。我在家里听说过的最长的名字是 7 个(!)名字,更不用说各种前缀和荣誉头衔等,有些人坚持在他们可以使用的任何地方使用,这实际上是他们官方名称的一部分(出现在他们的身份证上)。要为一个非常长的名字命名一个著名的例子,请查看Rudolph Valentino,他总共有 9 个名字。

如果您想建立一个真正国际化的系统,您将创建两个字段,家庭和名字,并让用户输入他们想要的任何内容。显示时,请务必考虑查看站点的人的姓名顺序。 (例如切换了匈牙利语。)另外,请注意只要求在其中一个字段中输入,因为有些人可能没有姓氏。

【讨论】:

  • 感谢您提供有趣的信息和提示!
  • 想知道'.'那是像 Dr./Mr. 这样的缩写/头衔吗?用英语吗?
  • 是的,博士。和 Dr. 是医生头衔(大小写问题)。然而,博士。 Lakatosné 实际上是这个人丈夫的名字,所以博士。前面的标题伴随着婚姻,而第二个博士。来自这个人自己的头衔。
猜你喜欢
  • 1970-01-01
  • 2022-08-10
  • 1970-01-01
  • 1970-01-01
  • 2021-09-08
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 2011-06-10
相关资源
最近更新 更多