PHP-RegEx用于德语全名与变音符号和一些国际化

Ing*_*dös 5 php regex preg-match

亲爱的Stackoverflowia,亲爱的RegEx-Gurus,

我正在网上搜索正则表达式模式,检查德语全名的合理性.我发现很多关于模式的帖子没有德语变音符号...从所有这些帖子和我的逻辑理解我一起构建这个模式:

^([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}))+$
Run Code Online (Sandbox Code Playgroud)

它应该符合以下可能的变化(现在状态)(预期):

  • "汉斯斯皮策"(比赛)(是的)
  • "hans spitzer"(匹配)(是)
  • "Hans-peterÖsterreicher"(匹配)(是)
  • "Anna-Marie Pelzer-Hahnenkamp博士"(匹配)(是)
  • "Dipl-Ing.Gerhard Meyer"(不可比赛)(不)
  • "Lisa-Maria Brandner-Kapeller"(匹配)(是)
  • "John Mc'Connor"(比赛)(是的)
  • "约翰"(不配)(是的)
  • "约翰"(比赛)(没有)
  • "Osama Al Sawarri"(匹配)(是)
  • "弗兰克F." (不匹配的)(是)
  • "Johann F. Kerner"(不配)(是的)
  • "Johann F Kerner"(比赛)(没有)
  • "li xian"(匹配)(是)
  • "李贤"(不配)(不)
  • "李甫"(不配)(不)
  • "li fu"(匹配)(是)

(现在状态表示现在是否匹配,预期表示它是否应该匹配)

我需要在PHP中将此模式用于preg_match.

如果有人能帮助我改进这种模式,我会非常感激.一旦它 - 几乎完美我将它添加到http://gskinner.com/RegExr/供公众使用(他们有2或3个全名检查,但它们不能正常工作或根本不工作).

谢谢.提前帮助你......

最好的问候,英格玛

Spu*_*ley 7

鉴于世界各地使用的各种完全有效的名称,您应该对其进行绝对最低限度的验证.当他们被告知他们的名字无效时,他们名字中带有连字符和叛教的人会理所当然地生气.

即使试图强制首字母在他们之后有一个点也许是错误的,因为世界上有很多人都有单字符名称.

因此,我的建议是根本不对其进行验证.

但是,如果你必须进行某种验证,那么我能给出的最好的建议是坚持过滤掉你绝对想要排除的符号,并避免做任何比这更复杂的事情.

所以简单的模式可能如下所示:

/[^\$%\^\*£=~@]/
Run Code Online (Sandbox Code Playgroud)

这将阻止用户在其名称中包含符号$或符号@,因为是的,对于有效名称而言,这些符号非常难以置信.但请确保您允许使用引号和连字符,逗号,甚至括号,因为真人在其名称中确实包含这些字符.

希望有所帮助.


Ing*_*dös 4

因此,如果有人找到此线程并正在寻找最佳答案,这里是:

\n\n

(感谢所有在此线程上提供的良好帮助!)

\n\n

使用这个正则表达式模式:

\n\n
^([^\\$%\\^*\xc2\xa3=~@\\d]+){2,30} ([^\\$%\\^\\.*\xc2\xa3=~@\\d]+){2,30}+$\n
Run Code Online (Sandbox Code Playgroud)\n\n

我上面的列表(原始问题)如下所示:

\n\n

可能的变化(现在的状态)(预期):

\n\n
    \n
  • “汉斯·斯皮策”(比赛)(是)
  • \n
  • “汉斯·斯皮策”(比赛)(是)
  • \n
  • “Hans-peter \xc3\x96sterreicher”(匹配)(是)
  • \n
  • “安娜-玛丽·佩尔泽-哈南坎普博士”(比赛)(是)
  • \n
  • “Dipl-Ing. Gerhard Meyer”(比赛)(是)
  • \n
  • “丽莎-玛丽亚·布兰德纳-卡佩勒”(比赛)(是)
  • \n
  • “约翰·麦康纳”(比赛)(是)
  • \n
  • “John”(不匹配)(是)
  • \n
  • “Johann”(不匹配)(是)
  • \n
  • “Osama Al Sawarri”(比赛)(是)
  • \n
  • “弗兰克·F。” (不匹配)(是)
  • \n
  • “Johann F. Kerner”(比赛)(是)
  • \n
  • “Johann F Kerner”(比赛)(否)
  • \n
  • “李贤”(匹配)(是)
  • \n
  • 《李现》(比赛)(是)
  • \n
  • 《李府》(匹配)(是)
  • \n
  • “li fu”(匹配)(是)
  • \n
\n\n

(解释:例如“li fu”(匹配)(是)的意思是,名字“li fu”匹配并且“yes”是预期的)

\n\n

再次感谢大家,这种模式正是我所追求的。

\n\n

此致,

\n\n

“Ingmar Erd\xc3\xb6s”(匹配)(是)

\n\n

PS:这种模式在基于 ecma (javascript) 的正则表达式操作中工作得很好,但在基于 prce 的操作(如 PHP 中的 preg_match)中似乎不起作用。\n有人知道如何将 ecma 转换为基于 prce 的模式吗???已经在谷歌上下搜索过,但根本没有在线转换器...\n请给我一些想法、提示或解决方案。谢谢。提前。

\n