【问题标题】:Unique regex for name validation用于名称验证的唯一正则表达式
【发布时间】:2016-06-04 14:48:56
【问题描述】:

我想检查正则表达式 PHP 的名称是否有效,但我需要一个允许的唯一正则表达式:

  • 字母(大写和小写)
  • 空格(最多 2 个)

但是空格后不能有空格.. 例如: 姓名 -> Dennis Unge Shishic(有效) 名称 -> Denis(空格)(空格)(无效)

希望大家理解我,谢谢:)

【问题讨论】:

  • 请发布您的尝试
  • 你有没有尝试过? ^[a-zA-Z]+\s[a-zA-Z]+(\s[a-zA-Z])?$ 或许或者仅仅是名字有效?
  • 我没有尝试任何正则表达式,因为我找不到任何东西..
  • 你能提供更多关于什么是有效的和无效的例子吗?
  • 可以有名字和姓氏,但也可以是名字-中间名-姓氏..所以两者都可以有效..并且只能有1或2个空格(不多也不少).. 例如:John Smith(有效)(包含 1 个空格) John Deny Smith(有效)(包含 2 个空格)

标签: php regex validation


【解决方案1】:

首先,值得一提的是a very bad idea 对人名有这样的限制性规则。但是,如果必须,像这样的简单字符类将限制您只能使用大写和小写英文字母:

[A-Za-z]

要匹配一个或多个,您需要在其后添加+。所以,这将匹配名称的第一部分:

[A-Za-z]+

要捕获第二个名字,你只需要在前面加一个空格做同样的事情,这样就可以捕获两个名字:

[A-Za-z]+ [A-Za-z]+

要使第二个名称可选,您需要用括号将其括起来并在其后添加?,如下所示:

[A-Za-z]+( [A-Za-z]+)?

要添加第三个名字,你只需要再做一次:

[A-Za-z]+( [A-Za-z]+)? [A-Za-z]+

或者,您可以指定后面的名称可以重复 1 到 2 次,如下所示:

[A-Za-z]+( [A-Za-z]+){1,2}

【讨论】:

  • 在这里使用[A-Za-z]*( [A-Za-z]+)?( [A-Za-z]+)? 可能更合适..因为如果开始有空间,您的正则表达式将不匹配..
  • @rock321987 我假设,根据问题的措辞,开头的空格是无效的。
  • 是的..如果最后有空格,我的建议将不匹配..无论如何我认为你的假设是正确的
  • 很难解释我想要什么..我希望它即使有 1 或 2 个空格也有效。名称可以包含名字和姓氏,它可以包含名字 - 中间名 - 姓氏名称..所以必须有1或2个空格,不能多,不能少..而且空格不能先输入,或者空格后空格(名称然后2个空格)..
  • 好的。我已更新我的答案以反映该要求
【解决方案2】:

为了使生成的代码易于理解和维护,您可以使用两个正则表达式。一项检查(要求为真)仅使用允许的字符^[a-zA-Z ]+$,然后另一项检查(要求为假)没有两个(或更多)相邻空格( ){2,}

【讨论】:

    【解决方案3】:

    尝试以下工作代码:
    将输入更改为您想要测试的任何内容并查看打印的正确验证结果

    <?php
    
    $input_line = "Abhishek  Gupta";
    preg_match("/[a-zA-Z ]+/", $input_line, $nameMatch);
    preg_match("/\s{2,}/", $input_line, $multiSpace);
    
    var_dump($nameMatch);
    var_dump($multiSpace);
    
    if(count($nameMatch)>0){
    
       if(count($multiSpace)>0){
        echo "Invalid Name Multispace";
        }
        else{
        echo "Valid Name";
        }
    }
    else{
    echo "Invalid Name";
    }
    
    ?>
    

    【讨论】:

    • 姓名 -> “AbhishekGupta” -> 有效(不应该是)姓名 -> “AbhishekGupta” -> 有效(不应该是)姓名 -> “AbhishekGupta” -> 有效(应该是t 是)名称 -> “Abhishek Gupta” -> 有效(应该是)名称 -> “Abhishek John Gupta” -> 有效(应该是)
    【解决方案4】:

    PHP 中只包含 Unicode 字母的一到三个单词的正则表达式看起来像

    /^\p{L}+(?:\h\p{L}+){1,2}\z/u
    

    说明:

    • ^ - 字符串开始
    • \p{L}+ - 一个或多个 Unicode 字母
    • (?:\h\p{L}+){1,2} - 一个或两个水平空格序列,后跟一个或多个 Unicode 字母
    • \z - 字符串结束,甚至不允许美元锚允许的尾随换行符。

    【讨论】: