名称字符串的正则表达式

时间:2015-01-09 14:58:09

标签: php regex validation

我试图找到一个涵盖很多结果的正则表达式,如果不是很多国际名称中包含特殊字母的话,我现在使用的那个就足够了以及连字符。

我现在使用的那个看起来像这样:

/^[A-Za-zåäöÅÄÖ\s\-\ ]*$/

它允许连字符和空格,但它也允许它们在字符串的开头或结尾,我不想允许。

我需要修改它以允许:

  • 特殊字母,例如éýÿüåäö等(最好不要手动全部写)
  • 每个新单词开头的大写字母
  • 单词之间的空格
  • -单词之间的连字符,但不是在完整字符串之前或之后
  • 它不应该允许数字,它还没有。由于我还没有完成正则表达式构建的工作,我对如何实现这一目标一无所知,我发现很多解决方案涵盖了一种或另一种情况,但不是我需要的所有。我很感激你的帮助。正则表达式应该适用于PHP验证。

    修改

    $fname = 'Scrooge Mc-Duck'; //Only example string
    $fname = trim($fname);
    
    if (!preg_match('/^\p{Lu}\p{Ll}+([ -]+\p{Lu}\p{Ll}+)*$/', $fname)) {
        $fnameErr = 'Invalid first name'; 
    }
    

    使用@ npinti解决方案时会输出错误。

    1 个答案:

    答案 0 :(得分:0)

    假设您的正则表达式引擎可以公开character classes。您可以使用\p{L}来匹配任何字母。因此,要匹配名称,您可以使用^\p{Lu}\p{Ll}+([ -]+\p{Lu}\p{Ll}+)*$

    这将允许您匹配大写字母后跟一个或多个小写字母。反过来,这可以是0个或更多个空格和破折号的组合,然后是大写字母和一个或多个小写字母。开头和结尾的^$确保正则表达式与整个字符串匹配。

    可以查看正则表达式的演示here