Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式不允许使用双下划线_Php_Regex - Fatal编程技术网

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

Php 正则表达式不允许使用双下划线,php,regex,Php,Regex,我正在写我的网站用户注册部分,我有一个简单的正则表达式,如下所示: if(preg_match("/^[a-z0-9_]{3,15}$/", $username)){ // OK... }else{ echo "error"; exit(); } 我不想让用户拥有像“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

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

if(preg_match("/^[a-z0-9_]{3,15}$/", $username)){
    // OK...
}else{
    echo "error";
    exit();
}
我不想让用户拥有像“
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

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;
}
函数替换\u重复\u下划线($string){
$final_str='';
$str_len=strlen($string);
$prev_char='';
对于($i=0;$i<$str_len;$i++){
如果($i>1){
$prev_char=$string[$i-1];
}
$this_char=$string[$i];
如果($prev_char=='''''''&&$this_char==''''''''{
}否则{
$final_str.=$this_char;
}
}
返回$final_str;
}
它工作得很好,但我想知道我是否也可以用正则表达式而不是另一个函数来检查它


如果有任何帮助,我将不胜感激。

只需添加负面展望,检查名称中是否有双下划线

/^(?!.*__)[a-z0-9_]{3,15}$/
(?!pattern)
,称为零宽度负前瞻,将检查是否无法在字符串中从“当前位置”(当前位置是正则表达式引擎所在的位置)的前面找到模式。它的宽度为零,因为它在过程中不使用文本,而不是外部的部分。这是负面的,因为只有在无法匹配模式的情况下匹配才会继续(所有可能性都已用尽)

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

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

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

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

/^(?!.*__)[a-z0-9_]{3,15}$/
(?!pattern)
,称为零宽度负前瞻,将检查是否无法在字符串中从“当前位置”(当前位置是正则表达式引擎所在的位置)的前面找到模式。它的宽度为零,因为它在过程中不使用文本,而不是外部的部分。这是负面的,因为只有在无法匹配模式的情况下匹配才会继续(所有可能性都已用尽)

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

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

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

可以使用正则表达式进行检查。甚至可以使用正则表达式替换将多个下划线折叠为一个下划线,也可以使用正则表达式进行检查。甚至可以用正则表达式替换将多个下划线折叠为一个。请解释一下这个正则表达式好吗?我可以使用它,但我不能写它,因为我不明白到底发生了什么,提前谢谢你能解释一下这个正则表达式吗?我可以使用它,但我不能写它,因为我不明白到底发生了什么,提前谢谢