私の登録ページでは、ユーザー名を英数字のみとして検証する必要がありますが、オプションのアンダースコアも使用できます。私はこれを思いついた:
function validate_alphanumeric_underscore($str)
{
return preg_match('/^\w+$/',$str);
}
これはうまくいくようですが、私は正規表現の専門家ではありません! 誰かが問題を見つけますか?
私の登録ページでは、ユーザー名を英数字のみとして検証する必要がありますが、オプションのアンダースコアも使用できます。私はこれを思いついた:
function validate_alphanumeric_underscore($str)
{
return preg_match('/^\w+$/',$str);
}
これはうまくいくようですが、私は正規表現の専門家ではありません! 誰かが問題を見つけますか?
実際に一致する文字\w
は、使用されているロケールによって異なります。
「単語」の文字は、任意の文字、数字、またはアンダースコア文字、つまり、Perl の「単語」の一部になり得る任意の文字です。文字と数字の定義は、PCRE の文字テーブルによって制御され、ロケール固有の照合が行われている場合は異なる場合があります。たとえば、"fr" (フランス語) ロケールでは、128 を超える文字コードがアクセント付き文字に使用され、これらは \w によって一致します。
したがって、許可する文字を明示的に指定する必要があります。
/^[A-Za-z0-9_]+$/
これにより、英数字とアンダースコアのみが許可されます。
また、アンダースコアを連結文字としてのみ許可し、ユーザー名をアルファベット文字で開始する必要がある場合は、次のようにします。
/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/
PHP ctype_alnumを許可された文字の配列と組み合わせて使用して、文字列を検証するカスタム関数を次に示します。
<?php
$str = "";
function validate_username($str) {
// each array entry is an special char allowed
// besides the ones from ctype_alnum
$allowed = array(".", "-", "_");
if ( ctype_alnum( str_replace($allowed, '', $str ) ) ) {
return $str;
} else {
$str = "Invalid Username";
return $str;
}
}
?>
試す
function validate_alphanumeric_underscore($str)
{
return preg_match('/^[a-zA-Z0-9_]+$/',$str);
}
私にはうまく見えます。アンダースコアを配置する必要がないことに注意してください。したがって、「username_」と「___username」はどちらもパスします。
連結としてアンダースコアのみを許可するために、gumboの2次正規表現を使用しますが、ユーザーが「special__username」のようになるように、_の後に+を追加します。
/^[A-Za-z][A-Za-z0-9]*(?:_+[A-Za-z0-9]+)*$/
あなた自身の解決策はまったく問題ありません。
preg_match
Perl に似た正規表現を使用します。この正規表現では、文字クラス\w
が必要なものと正確に一致するように定義されています。
\w
- 「単語」文字に一致 (英数字と「_」)
(ソース)