我想验证用户的名字和姓氏,以便在全球社交社区注册。
我想允许所有这些与语言相关的特殊字符,例如ÄÖÜÀýéè
和最多 3 的名字,所有字符都用空格分隔(如果有的话)超过1个名字)。
也不允许使用下划线或其他特殊字符,但应允许使用减号( - )。
这就是我能想到名字中应该允许的内容。我不知道除了德国之外的其他国家是怎么回事,但是在这里你最多可以有3个名字和一个姓氏也可以有2个单词,比如“von Seidenfeld”。 也许你也可以在这里给我一些建议,因为我想在全世界范围内为每个全名覆盖这个名称验证系统。
我也知道我要使用RegEx,但我不知道如何只允许我刚写的这些条件。
到目前为止我所拥有的:
if (!preg_match('/^(\pL+\s+)$/u', $value)) echo 'error';
或查看此处:http://regex101.com/r/tE0uQ5(遗憾地无效,无匹配)
答案 0 :(得分:4)
这就是我能想到名字中应该允许的内容。
甚至没有关闭。
我不知道除了德国之外的其他国家有多少,但在这里你最多可以有3个名字,一个姓氏也可以有2个单词,比如“von Seidenfeld”。
在其他国家/地区有所不同。在德国,它可能也有所不同,只是不是因为你的名字或者你现在正在思考的人名。
我想为全世界的每个全名覆盖这个名称验证系统。
This应该要求阅读这个主题。但总结一下......没有办法做到这一点。没有。如果您绝对需要与名称this might help匹配的正则表达式。
根据定义,某人以其名称进入您的系统的任何内容都是他们的名字,至少就您的系统而言。这是他们决定你应该识别它们的方式。这是他们在其管辖范围内的合法名称吗?在你的辖区?这是他们父母称之为的名字吗?他们的朋友叫他们的名字?这些都不能用正则表达式验证。
简而言之......只需接受任何非空输入作为名称。
答案 1 :(得分:2)
忘记名称验证,如果它是国际的。举个例子,这是一个完全有效的匈牙利名字:
dr. Lakatosné Dr. Bíró-Kis Imola
Imola是给定的名字,其余的是姓氏,只是为了混淆一些东西。祝你好运,反对任何事情。如果您想要更多令人头疼的例子,请让艺术家(例如法律允许注册艺术家姓名)成为他们正式名称的一部分。
一般来说,名字有不同的起源,例如某些文化习惯总是添加父亲的名字以及附加自己的名字。我家里听到的最长的名字是7(!)给出的名字,更不用说各种前缀和荣誉头衔等等,有些人坚持在任何地方使用它们,这实际上是他们官方名称的一部分(出现在他们的身份证上)。要为一个很长的名字命名一个着名的例子,请查看总共有9个名字的Rudolph Valentino。
如果您想构建一个真正的国际系统,您将创建两个字段,系列和给定名称,并让用户输入他们想要的任何内容。显示时,请务必考虑查看网站的人的姓名顺序。 (例如匈牙利语被切换。)另外,要特别注意要求只在其中一个字段中输入,因为有些人可能没有姓氏。
答案 2 :(得分:0)
我建议寻找无效字符而不是有效字符,以简化操作:
^((?:(?:(?<!^)[ ])?[^*&@_#$\]\\\^\d ]+){1,3})$
我必须在末尾(],\,^, - )中转义4个特殊字符。还添加\ d来过滤掉数字。
在这里看到它! http://regex101.com/r/vY9wW5
我打赌不再有人在意,但我让这只小狗在工作。问题是我意识到应该如何转义PHP字符串(使用单引号,只需要将转义的反斜杠加倍),并且正则表达式测试人员和可能的在线标识都以微妙的方式搞乱我的字符串。
<?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);
?>
那说,我认为有些奇怪符号的名称,例如数字和符号,这些符号很少,你可以让它们围绕一个现实检查过滤器,以换取能够过滤掉按钮粉碎机从您的登录过程。