PHP で正規表現を実行しようとしていますが、バグが発生し続けています。A ~ Z、0 ~ 9、アンダースコア (_) にしたいのですが、テキストの端にアンダースコアを使用することはできません。内側のみ。
これが私が持っているものです:
if (!ereg("^[a-zA-Z0-9_]{3,16}$",$username)) {
// Does not match
}else{
// Good job, within rules!
}
PHP で正規表現を実行しようとしていますが、バグが発生し続けています。A ~ Z、0 ~ 9、アンダースコア (_) にしたいのですが、テキストの端にアンダースコアを使用することはできません。内側のみ。
これが私が持っているものです:
if (!ereg("^[a-zA-Z0-9_]{3,16}$",$username)) {
// Does not match
}else{
// Good job, within rules!
}
これが最善の方法かどうかはわかりませんが、うまくいくはずです:
^[a-zA-Z0-9][a-zA-Z0-9_]{1,14}[a-zA-Z0-9]$
2
文字列の先頭/末尾に 2 文字あるため、境界を減らしました。
まず、ereg
非推奨です。preg_match
代わりに使用してください。
第 2 に、アンダースコアで開始または終了しない限り、3 文字以上 16 文字以下の文字、数字、およびアンダースコアの文字列と一致させたいと考えています。@Blenderのソリューションが機能します。しかし、いったん を使用するpreg_match
と、つまり PCRE を使用すると、もう少しコンパクトに実行できる機能にアクセスできます。先頭または末尾のアンダースコアを処理するルックアラウンド アサーションと\w
、すでに文字、数字、およびアンダースコア:
if (!preg_match('/^(?!_)\w{3,16}(?<!_)$/', $username)) {
// Does not match
} else {
// Good job, within rules!
}