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 negative look-aheadと呼ばれるは、「現在の位置」(現在の位置は正規表現エンジンがある位置) から文字列内で前方にパターンを見つけることができないことを確認します。外側の部分とは対照的に、プロセスでテキストを消費しないため、ゼロ幅です。パターンに一致する方法がない場合にのみ一致が続行されるため、これは否定的です(すべての可能性が尽きます)。

パターンは です.*__。したがって、一致が に見つからない場合.*__、つまり文字列の先頭に二重のアンダースコアがない場合にのみ、一致が続行されることを意味し__ます。グループはテキストを消費しないため、文字列が pattern の後半部分と一致し始めるときは、まだ文字列の先頭にいます[a-z0-9_]{3,15}$

で大文字のユーザー名を既に許可していますが、大文字とstrtolower小文字を区別しないフラグを追加することで、正規表現で直接検証を行うことができますi

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