我正在编写我的网站用户注册部分,我有一个简单的正则表达式如下:
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;
}
它工作正常,但我想知道我是否也可以用正则表达式来检查它而不是另一个函数。
我将不胜感激。
答案 0 :(得分:4)
只需添加否定前瞻以检查名称中是否有双下划线。
/^(?!.*__)[a-z0-9_]{3,15}$/
(?!pattern)
,称为零宽度负向预测,将检查是否无法在“当前位置”(当前位置)的字符串前面找到该模式是正则表达式引擎所处的位置。它是零宽度,因为它不会消耗过程中的文本,而不是外部的部分。这是否定的,因为匹配只会在无法匹配模式时才会继续(所有可能性都已用完)。
模式为.*__
,因此它只是意味着匹配只有在找不到.*__
的匹配项时才会继续,即字符串中没有双重下划线__
。由于该组不使用文本,因此当它开始匹配模式[a-z0-9_]{3,15}$
的后一部分时,您仍将位于字符串的开头。
您已经允许使用strtolower
的大写用户名,但是,仍然可以通过添加不区分大小写的标记i
来直接使用regex进行验证:
/^(?!.*__)[a-z0-9_]{3,15}$/i