簡體   English   中英

正則表達式不允許下划線

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM