2015-01-09 25 views
0

我试图找到一个覆盖很多结果的正则表达式,我现在使用的正则表达式就足够了,如果它不是很多具有特殊字母的国际名称作为连字符。正则表达式的名称字符串

我现在使用的一个看起来是这样的:

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

它允许连字符和空格,但它也可以让他们在我不希望允许字符串的开始或结束。

我需要修改这个允许:

  • 特殊字母,如éýÿüåäö等(最好是通过不将它们全部手工编写)在每个新词的开头
  • 大写字母
  • 也就是说
  • -词与词之间的连字符,而不是之前或满弦后
  • 它不应该让N的空白尚未成为会员。由于我没有用过很多正则表达式构造,所以我在黑暗中如何实现这一点,我发现了很多涵盖其中一种或另一种场景的解决方案,但不是我需要的那些全部 。我将不胜感激这项援助。正则表达式应该适用于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的解决方案时,此输出错误。

    +0

    什么正则表达式引擎/平台? –

    +0

    @AlexK。我使用PHP来验证这是否意味着什么。 – Chrillewoodz

    +0

    请参阅'\ p {L}'@ http://php.net/manual/en/regexp.reference.unicode.php&http://www.regular-expressions.info/unicode.html –

    回答

    0

    假设您的正则表达式引擎可以暴露character classes。您可以使用\p{L}匹配的任何字母。所以,要匹配一个名字,你可以使用^\p{Lu}\p{Ll}+([ -]+\p{Lu}\p{Ll}+)*$

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

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

    +0

    不幸的是,它似乎不支持它,有没有其他选择? – Chrillewoodz

    +0

    @Chrillewoodz:你使用的是什么版本的PHP? – npinti

    +0

    @PaulCrovella:我尝试过使用你提到的方法,但由于某种原因,我无法让它工作。如果你可以提供一个例子,它将是有用的:)。 – npinti