1

我想验证用户在全球社交社区注册的前名和姓氏。

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

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

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

到目前为止我所拥有的:

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

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

4

3 回答 3

4

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

差远了。

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

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

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

应该是该主题的必读内容。但总而言之......没有办法做到这一点。没有任何。如果您绝对需要一个匹配名称的正则表达式,这可能会有所帮助

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

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

于 2013-10-25T18:37:00.073 回答
2

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

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

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

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

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

于 2013-10-25T19:14:05.253 回答
0

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

^((?:(?:(?<!^)[ ])?[^*&@_#$\]\\\^\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);
?>

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

于 2013-10-25T18:42:06.147 回答