0

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

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

我不想让用户拥有像:' ___'或' x________y'这样的用户名,这是我刚刚编写的用于替换双下划线的函数:

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;
}

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

我将不胜感激任何帮助。

4

1 回答 1

4

只需添加负前瞻即可检查名称中是否有双下划线。

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

(?!pattern),称为零宽度负前瞻,将检查是否无法从“当前位置”开始在字符串中找到模式(当前位置是正则表达式引擎所在的位置)。它是zero-width,因为它不消耗过程中的文本,而不是外部的部分。它是否定的,因为只有在无法匹配模式的情况下才会继续匹配(所有可能性都已用尽)。

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

您已经允许使用大写用户名strtolower,但是,仍然可以通过添加不区分大小写的标志直接使用正则表达式进行验证i

/^(?!.*__)[a-z0-9_]{3,15}$/i
于 2013-01-27T20:24:27.527 回答