【问题标题】:PHP Regex for full names in a specific format特定格式的全名的 PHP 正则表达式
【发布时间】:2013-05-04 00:06:34
【问题描述】:

我正在尝试创建一个函数来使用正则表达式验证 PHP 上的名称,我希望名称能够携带无限数量的空格和 ' 和 -,并且只允许空格后的大写字符,但允许大写和- 和 '. 之后没有大写字母。总长度应为 50 个字符,名称应以小写字母结尾,注意大写字母是 A 到 Z 加上这些字符:

ÙÒÌÈÀÁÉÍßÓÚÝÂÊÎÔÛÃÑÕÄÅÆŒÇÐØËÏÖÜŸ

小写字母是 a 到 z 加上这些字符:

éçàèàèìòùáéíóúýâêîôûãñõäëïöüÿåæœçðøß

每个单词(在空格、' 或 - 和另一个之间)应至少包含 2 个字符 名称还应以大写字母开头并以小写字母结尾和单词(在空格、' 或 - 和另一个之间)不允许大写,但允许开头的大写

可接受的名称示例如下:

亚当·克尔斯德
亚当'odskdl
亚当'Ddlsl
Ùdam-ddkkdk
添加ssd-Ddsdsd

我已经尝试了很多,但这是我最后一次尝试,我仍然保留在我的 php 文件中,其他我在不成功尝试的混乱中删除了(使用 mb_ereg 函数匹配,所以这是一个 posix -ere):

([A-ZÙÒÌÈÀÁÉÍßÓÚÝÂÊÎÔÛÃÑÕÄÅÆŒÇÐØËÏÖÜŸ][a-zéçàèàèìòùáéíóúýâêîôûãñõäëïöüÿåæœçðøß]+){1}((^[\'\-\s])[A-ZÙÒÌÈÀÁÉÍßÓÚÝÂÊÎÔÛÃÑÕÄÅÆŒÇÐØËÏÖÜŸ][a-zéçàèàèìòùáéíóúýâêîôûãñõäëïöüÿåæœçðøß]+)*

(这并不一定意味着这是最好的尝试,但我可能会有所帮助并让我知道我有多傻)

【问题讨论】:

  • 不是解决方案,而是从字母只有 A-Z 的变体开始。那么模式还没有那么大。在它工作之后,很容易添加其他字母。并为自己创建一个测试脚本,您可以在其中针对一组您已经知道结果的字符串运行匹配函数。这样您就可以更快地测试并编写您的正则表达式。
  • Jim McSomething 这样的名字呢?骆驼案绝对是存在于不太晦涩的名称中的东西。
  • IMO 最佳解决方案,不要验证名称,顺其自然。
  • 你为什么要验证名字?顺便说一句,我听说!xobile 也是一个名字:|
  • 是的,验证名称是一场艰苦的战斗。有太多的变量需要解释。 @Ejay 提到的非洲名字 !xobile 就是一个很好的例子。如果您坚持至少对名称进行粗略检查(以便它们不仅仅是垃圾),那么请查看 Unicode characters,即 \pL 以获取 Unicode 字母字符。

标签: php regex posix-ere


【解决方案1】:

我不完全建议您使用它...但我认为这可以满足您的需求?

^([A-ZÙÒÌÈÀÁÉÍßÓÚÝÂÊÎÔÛÃÑÕÄÅÆŒÇÐØËÏÖÜŸ][a-zéçàèàèìòùáéíóúýâêîôûãñõäëïöüÿåæœçðøß]+){1}((([\s])[A-ZÙÒÌÈÀÁÉÍßÓÚÝÂÊÎÔÛÃÑÕÄÅÆŒÇÐØËÏÖÜŸ][a-zéçàèàèìòùáéíóúýâêîôûãñõäëïöüÿåæœçðøß]+)|((['\-])([A-ZÙÒÌÈÀÁÉÍßÓÚÝÂÊÎÔÛÃÑÕÄÅÆŒÇÐØËÏÖÜŸ]|[a-zéçàèàèìòùáéíóúýâêîôûãñõäëïöüÿåæœçðøß])[a-zéçàèàèìòùáéíóúýâêîôûãñõäëïöüÿåæœçðøß]+))*$

它在一个非代码块中,所以你可以看到它是多么的疯狂......尽管它在这里剥离了一些字符:

^([A-ZÙÒÌÈÀÁÉÍßÓÚÝÂÊÎÔÛÃÑÕÄÅÆŒÇÐØËÏÖÜŸ][a-zéçàèàèìòùáéíóúýâêîôûãñõäëïöüÿåæœçðøß]+){1}((([\s])[A-ZÙÒÌÈÀÁÉÍßÓÚÝÂÊÎÔÛÃÑÕÄÅÆŒÇÐØËÏÖÜŸ][a-zéçàèàèìòùáéíóúýâêîôûãñõäëïöüÿåæœçðøß]+)|((['-])([ a-zùòìè-áéñ儿了 - çðøëïöüÿ

【讨论】:

    【解决方案2】:

    这个正则表达式是否回答了您需要检查的内容?

    (当然,您必须在每个括号内添加奇怪的字符)。

    【讨论】:

    • 我认为这并没有涵盖关于空格、' 和 - 之后的大写/小写名称的规则。
    • @SeekingKnowledge 阅读屏幕下方的评论,以获取正确的正则表达式,将所有[A-Z] 替换为您的[A-ÙÒÌÈÀÁÉÍßÓÚÝÂÊblablabla]。它甚至可以与“Ù”一起使用。这是出于可读性原因
    • @DougW 可能不适用于“长破折号”或逗号,您必须将其添加到中间括号中,此处为:[-'\s]。它实际上匹配Adam Test 而不是Adam test。不知道这就是他要找的东西
    • 它没有涵盖空格后面的字符与破折号或撇号后面的字符的不同规则。
    • 是的,我不完全确定。他提到了一个数字,例如总长度为 50 个字符并以小写字母结尾。不过,其中一些可能应该在正则表达式之外处理。
    【解决方案3】:

    您可以使用它来避免重音字符问题:

    $pattern = "~^[\p{Lu}ß]\p{Ll}*+(?>(?> [\p{Lu}ß]|['-]\p{L})\p{Ll}*+)*$~u";
    if(preg_match($pattern, $name)) { ...
    

    或者对于更具体的字符集:

    $pattern = "~(?(DEFINE)(?<Up>[A-ZÙÒÌÈÀÁÉÍßÓÚÝÂÊÎÔÛÃÑÕÄÅÆŒÇÐØËÏÖÜŸ]))
                 (?(DEFINE)(?<Lo>[a-zéçàèàèìòùáéíóúýâêîôûãñõäëïöüÿåæœçðøß]))
                 ^\g<Up>\g<Lo>*+(?>(?>\h\g<Up>|['-]\g<Up>?+\g<Lo>)\g<Lo>*+)*+$~ux";
    
    if (preg_match($pattern, $name, $matches)) { ...
    

    或以更短的方式相同:

    $pattern = "~(?(DEFINE)(?<Up>[A-ZÀ-ÖØ-ݟߌ]))
                 (?(DEFINE)(?<Lo>[a-zà-öø-ýÿßœ]))
                 ^\g<Up>\g<Lo>*+(?>(?>\h\g<Up>|['-]\g<Up>?+\g<Lo>)\g<Lo>*+)*+$~ux";
    

    【讨论】:

    • 非常好,但他说他使用的是mb_ereg(),所以他仅限于 POSIX-ERE 语法/功能。
    • @AlanMoore:Saperlipopette!没想到他跟这方面的事情有这么大的关系!
    猜你喜欢
    • 2016-08-09
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 2012-05-06
    相关资源
    最近更新 更多