PHP正则表达式,用于德语全名,带有umlauts和一些国际化
亲爱的乘客们:, 尊敬的RegEx大师 我在网上搜索regex模式,该模式检查德语全名的合理性。我发现很多关于没有德国umlauts aso的模式的帖子。。。根据所有这些帖子和我的逻辑理解,我构建了这个模式:PHP正则表达式,用于德语全名,带有umlauts和一些国际化,php,regex,preg-match,Php,Regex,Preg Match,亲爱的乘客们:, 尊敬的RegEx大师 我在网上搜索regex模式,该模式检查德语全名的合理性。我发现很多关于没有德国umlauts aso的模式的帖子。。。根据所有这些帖子和我的逻辑理解,我构建了这个模式: ^([A-ZÖÄÜ]{0,1})([-a-zäöüß\.']{2,30})( {1}|-{1})([A-ZÄÖÜ]{0,1})([a-zäöüß']{0,30})( {1}|-{1})?([A-ZÖÄÜ]{0,1})([a-zäöüß']{0,30})(( {0,1}|-{1})([A-Z
^([A-ZÖÄÜ]{0,1})([-a-zäöüß\.']{2,30})( {1}|-{1})([A-ZÄÖÜ]{0,1})([a-zäöüß']{0,30})( {1}|-{1})?([A-ZÖÄÜ]{0,1})([a-zäöüß']{0,30})(( {0,1}|-{1})([A-ZÖÄÜ]{0,1})([a-zäöüß']{0,30}))+$
它应符合以下可能的变化(当前状态)(预期):
- “汉斯·斯皮策”(比赛)(是)
- “汉斯·斯皮策”(比赛)(是)
- “汉斯·彼得·奥斯特雷彻”(比赛)(是)
- “安娜·玛丽·佩尔泽·哈内坎普博士”(比赛)(是)
- “迪普·格哈德·迈耶”(没有对手)(没有)
- “丽莎·玛丽亚·布兰德纳·卡佩勒”(比赛)(是)
- “约翰·麦克康纳”(比赛)(是)
- “约翰”(没有对手)(是的)
- “约翰”(比赛)(否)
- “奥萨马·萨瓦里”(比赛)(是)
- “Frank F.”(不匹配)(是)
- “约翰·F·克纳”(不匹配)(是)
- “约翰·F·克纳”(比赛)(否)
- “李贤”(比赛)(是)
- “李贤”(无对手)(无对手)
- “李福”(没有对手)(没有)
- “李福”(比赛)(是)
向你问好,英格玛好的,在你的评论之后,你想要什么就更清楚了。但这仍然不是真的可能。其他角色呢?例如,“安德烈”、“伯恩哈德·霍克尔”或与你同名的“保罗·埃尔德斯” 如果你想允许一个名字,那么不可能禁止“哈哈哈” 而不是将所有内容都塞进一个正则表达式中。您可以做一些简单的测试:
- 是否至少有一个空格(除非您希望允许使用单个名称,并且有些地方的人只有一个名称)
- 是第一个大写字母(例如使用)
- 它是否包含任何“禁止”字符,例如“$”
- 等等
- 数字字符
- 除连字符以外的数学运算符
- 斜杠、双引号和其他非预期名称 字符(&^%*$#)
- 换行符和段落字符
- 制表符
<?php
$score = '0';
$notInNames = "![0-9!@#$%^&*()_+={}|\\\\;\"\n\r\t\[\]<>?/]!";
if(!preg_match($notInNames,$potentialName)){
//It could be a real name
} else {
$score = $score+10;
}
if(preg_match('!(^[.-]|[.-]$)!',$potentialName)){
$score = $score+10;
}
if(!preg_match('! !',$potentialName)){
// no spaces in the name, give them a +1
$score++;
}
if($score > 5){
//not a name.
}
?>
考虑到世界各地使用的大量完全有效的名称,您应该对其进行绝对最少的验证。当人们被告知自己的名字无效时,名字中有连字符和撇号的人会理所当然地生气 甚至试图强迫首字母后面有一个点也可能是错误的,因为世界上有很多人的名字都是单字符的 因此,我的建议是根本不要验证它 然而,如果您必须进行某种验证,那么我能给出的最好建议是坚持过滤掉您肯定要排除的符号,并避免做任何比这更复杂的事情 因此,一个简单的模式可能如下所示:
/[^\$%\^\*£=~@]/
这将阻止用户在其名称中包含诸如$
或@
之类的符号,因为是的,这些符号对于有效名称来说是非常不可信的。但请确保您允许引号和连字符、逗号,甚至括号,因为真实的人的名字中确实有这些字符
希望这能有所帮助。因此,如果有人找到了这条线索,并正在寻找最佳答案,那么它就是: (Thanx向该线程上的所有人提供良好帮助!) 使用此正则表达式模式:
^([^\$%\^*£=~@\d]+){2,30} ([^\$%\^\.*£=~@\d]+){2,30}+$
我上面的列表(原始问题)如下所示:
/[^\$%\^\*£=~@]/
可能的变化(当前状态)(预计):
- “汉斯·斯皮策”(比赛)(是)
- “汉斯·斯皮策”(比赛)(是)
- “汉斯·彼得·奥斯特雷彻”(比赛)(是)
- “安娜·玛丽·佩尔泽·哈内坎普博士”(比赛)(是)
- “迪普·格哈德·迈耶”(比赛)(是)
- “丽莎·玛丽亚·布兰德纳·卡佩勒”(比赛)(是)
- “约翰·麦克康纳”(比赛)(是)
- “约翰”(没有对手)(是的)
- “约翰”(没有对手)(是的)
- “奥萨马·萨瓦里”(比赛)(是)
- “Frank F.”(不匹配)(是)
- “约翰·F·克纳”(比赛)(是)
- “约翰·F·克纳”(比赛)(否)
- “李贤”(比赛)(是)
- “李贤”(比赛)(是)
- “李福”(比赛)(是)
- “李福”(比赛)(是)
请给我一些想法、提示或解决方案。Thnx。提前。你想要的是不可能的。一般来说,计算机(甚至可能是人类)不可能说出什么是“合理的全名”,什么不是——最肯定的是,不仅仅是用计算机