[英]Regular Expression not allow duble underscores
我正在编写我的网站用户注册部分,我有一个简单的正则表达式,如下所示:
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;
}
它工作正常,但我想知道是否也可以使用正则表达式而不是其他函数进行检查。
我将不胜感激任何帮助。
只需添加否定的前瞻即可检查名称中是否包含双下划线。
/^(?!.*__)[a-z0-9_]{3,15}$/
(?!pattern)
,称为零宽度负向超前 ,将检查在字符串中从“当前位置”开始(当前位置是正则表达式引擎所在的位置) 的前面 ,无法找到该模式。 。 它是零宽度的 ,因为它在过程中不消耗文本,而不是外面的部分。 这是否定的,因为只有在没有办法匹配模式(所有可能性都用尽了)的情况下 ,匹配才会继续。
模式是.*__
,所以它只是意味着匹配将仅在找不到.*__
的匹配时才继续,即字符串中没有双下划线__
。 由于该组不使用文本,因此当它开始与模式[a-z0-9_]{3,15}$
后半部分匹配时,您仍将位于字符串的开头。
您已经使用strtolower
允许使用大写的用户名了,不过,仍然可以通过添加不区分大小写的标志i
直接使用regex进行验证:
/^(?!.*__)[a-z0-9_]{3,15}$/i
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.