RegEx问题:Preg_Match只有2个非连续的空格,没有特殊字符[PHP]

时间:2015-10-22 15:02:22

标签: php regex

因此,对于我的班级,我们正在模拟某人将第一,中间和姓氏放入表格中。我有一个变量$fullname,它会连接它们并拉出一个中间的首字母以及strtolowerucfirst ......

因此rObERT jAmES smITH被解析为Robert J Smith

现在,如果有人要放R!bert J Smith(注意特殊字符" !")它会被接受。为了解决这个问题,我使用If进行了else / pregmatch声明。

if (preg_match("/[^a-z\s]/i",$fullname)) {
        echo ("<span class = 'warning'>Invalid User Name!</span>"."<br>"
                ."Please use only characters A-Z for your name."."<br>");
        exit; 
    }
    else {                   
        echo ("User Name: ".$fullname."<br>"); 
    } 

这基本上说如果除了字母和空格之外还有什么东西,请抛出我的回音信息。

如果有人要输入R obert J Smith,我现在遇到了问题。 (注意Ro之间的空格字符。因为我允许空格,所以它说没关系。这继续搞乱我所有的&#34; create username and password&#34;以后的功能。

TLDR:我要问的是什么才能使pregmatch匹配或不匹配2个非连续的空格,只有A-Z/i

注意:我尝试了\s {2}的各种版本,但这是连续的空格,而不是非连续的空格。

PS:只有2个空格。我在将输入解析为$fullname之前修剪输入。

我现在已经尝试了3个小时,但是挫败感阻碍了我在不同方向上接近这个问题的能力。

谢谢你, thelaughingman

2 个答案:

答案 0 :(得分:0)

您可以使用此正则表达式匹配仅允许1或2个空格的全名:

private void setClientAdditionalInfo(Map map, Client client, User user) {

    Map additionalInfo = (Map) map.get("additionalInfo");

    if (checkMapProperty(additionalInfo, "gender")) {
        client.setGender(additionalInfo.get("gender").toString());
    }
    if (checkMapProperty(additionalInfo, "race")) {
        client.setRace(additionalInfo.get("race").toString());
    }
    if (checkMapProperty(additionalInfo, "ethnicity")) {
        client.setEthnicity(additionalInfo.get("ethnicity").toString());
    }
   .....

RegEx Demo

String匹配任何unicode字母,而'/^\p{L}+(?:\h\p{L}+){1,2}$/u' 则支持正则表达式中的unicode。

答案 1 :(得分:0)

可以使用正则表达式:

/^\w+(\s\w+){0,2}$/

匹配1个,2个或3个以空格分隔的单词,或者使用它来始终匹配3:

/^\w+\s\w+\s\w+$/

但您也可以将检查无效字符(/[^\w]/)与检查输入的字数分开:

if ( count( explode(' ', $fullname) ) != 3 )