正则表达式不允许使用duble下划线

时间:2013-01-27 20:22:52

标签: php regex

我正在编写我的网站用户注册部分,我有一个简单的正则表达式如下:

if(preg_match("/^[a-z0-9_]{3,15}$/", $username)){
    // OK...
}else{
    echo "error";
    exit();
}

我不想让用户拥有像“___”或“x________y”这样的用户名,这是我刚才写的替换duble下划线的函数:

function replace_repeated_underScores($string){
    $final_str = '';
    $str_len = strlen($string);
    $prev_char = '';
    for($i = 0; $i < $str_len; $i++){
        if($i > 1){
            $prev_char = $string[$i - 1];
        }
        $this_char = $string[$i];
        if($prev_char == '_' && $this_char == '_'){

        }else{
            $final_str .= $this_char;
        }
    }
    return $final_str;
}

它工作正常,但我想知道我是否也可以用正则表达式来检查它而不是另一个函数。

我将不胜感激。

1 个答案:

答案 0 :(得分:4)

只需添加否定前瞻以检查名称中是否有双下划线。

/^(?!.*__)[a-z0-9_]{3,15}$/

(?!pattern),称为零宽度负向预测,将检查是否无法在“当前位置”(当前位置)的字符串前面找到该模式是正则表达式引擎所处的位置。它是零宽度,因为它不会消耗过程中的文本,而不是外部的部分。这是否定的,因为匹配只会在无法匹配模式时才会继续(所有可能性都已用完)。

模式为.*__,因此它只是意味着匹配只有在找不到.*__的匹配项时才会继续,即字符串中没有双重下划线__。由于该组不使用文本,因此当它开始匹配模式[a-z0-9_]{3,15}$的后一部分时,您仍将位于字符串的开头。

您已经允许使用strtolower的大写用户名,但是,仍然可以通过添加不区分大小写的标记i来直接使用regex进行验证:

/^(?!.*__)[a-z0-9_]{3,15}$/i