PHP正则表达式,用于德语全名,带有umlauts和一些国际化

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

亲爱的乘客们:, 尊敬的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ÖÄÜ]{0,1})([a-zäöüß']{0,30}))+$
它应符合以下可能的变化(当前状态)(预期):

  • “汉斯·斯皮策”(比赛)(是)
  • “汉斯·斯皮策”(比赛)(是)
  • “汉斯·彼得·奥斯特雷彻”(比赛)(是)
  • “安娜·玛丽·佩尔泽·哈内坎普博士”(比赛)(是)
  • “迪普·格哈德·迈耶”(没有对手)(没有)
  • “丽莎·玛丽亚·布兰德纳·卡佩勒”(比赛)(是)
  • “约翰·麦克康纳”(比赛)(是)
  • “约翰”(没有对手)(是的)
  • “约翰”(比赛)(否)
  • “奥萨马·萨瓦里”(比赛)(是)
  • “Frank F.”(不匹配)(是)
  • “约翰·F·克纳”(不匹配)(是)
  • “约翰·F·克纳”(比赛)(否)
  • “李贤”(比赛)(是)
  • “李贤”(无对手)(无对手)
  • “李福”(没有对手)(没有)
  • “李福”(比赛)(是)
(其中,status now表示当前是否匹配,expected表示是否应该匹配)

我需要在PHP中使用这个模式进行preg_匹配

如果有人能帮我完善这个模式,我会非常感激的。一旦它接近完美,我将把它添加到公共用途中(它们有2到3个全名检查,但它们工作不好或根本不工作)

Thx。提前感谢你的帮助


向你问好,英格玛好的,在你的评论之后,你想要什么就更清楚了。但这仍然不是真的可能。其他角色呢?例如,“安德烈”、“伯恩哈德·霍克尔”或与你同名的“保罗·埃尔德斯”

如果你想允许一个名字,那么不可能禁止“哈哈哈”

而不是将所有内容都塞进一个正则表达式中。您可以做一些简单的测试:

  • 是否至少有一个空格(除非您希望允许使用单个名称,并且有些地方的人只有一个名称)
  • 是第一个大写字母(例如使用)
  • 它是否包含任何“禁止”字符,例如“$”
  • 等等

单独使用RegEx来尝试这样做是不现实的

我发现做这类事情最好的方法是采取相反的方法。与其对可能的名字进行字典攻击(这可能是使用人口普查和出生记录),不如从整体上看名字的模式(在本例中为德语名字),并寻找可以用来识别绝对不是名字的东西。你必须考虑来自其他国家的日耳曼化名字,因为这些例子涉及到那些已经搬到德国的人

不属于名称的内容包括:

  • 数字字符
  • 除连字符以外的数学运算符
  • 斜杠、双引号和其他非预期名称 字符(&^%*$#)
  • 换行符和段落字符
  • 制表符
代码:

<?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·克纳”(比赛)(否)
  • “李贤”(比赛)(是)
  • “李贤”(比赛)(是)
  • “李福”(比赛)(是)
  • “李福”(比赛)(是)
(解释:例如,“li fu”(匹配)(是)表示“li fu”的名称匹配,并且“yes”的意思应该是匹配的)

再次告诉大家,这种模式正是我想要的

致以最良好的祝愿

“英格玛·埃尔德斯”(比赛)(是)

PS:此模式在基于ecma(javascript)的正则表达式操作中非常有效,但在基于prce的操作中(如PHP中的preg_match)则不起作用。 有人知道如何将ecma转换为基于prce的模式吗???上下搜索过谷歌,但根本没有在线转换器。。。
请给我一些想法、提示或解决方案。Thnx。提前。

你想要的是不可能的。一般来说,计算机(甚至可能是人类)不可能说出什么是“合理的全名”,什么不是——最肯定的是,不仅仅是用计算机