38

私の登録ページでは、ユーザー名を英数字のみとして検証する必要がありますが、オプションのアンダースコアも使用できます。私はこれを思いついた:

function validate_alphanumeric_underscore($str) 
{
    return preg_match('/^\w+$/',$str);
}

これはうまくいくようですが、私は正規表現の専門家ではありません! 誰かが問題を見つけますか?

4

6 に答える 6

73

実際に一致する文字\wは、使用されているロケールによって異なります。

「単語」の文字は、任意の文字、数字、またはアンダースコア文字、つまり、Perl の「単語」の一部になり得る任意の文字です。文字と数字の定義は、PCRE の文字テーブルによって制御され、ロケール固有の照合が行われている場合は異なる場合があります。たとえば、"fr" (フランス語) ロケールでは、128 を超える文字コードがアクセント付き文字に使用され、これらは \w によって一致します。

したがって、許可する文字を明示的に指定する必要があります。

/^[A-Za-z0-9_]+$/

これにより、英数字とアンダースコアのみが許可されます。

また、アンダースコアを連結文字としてのみ許可し、ユーザー名をアルファベット文字で開始する必要がある場合は、次のようにします。

/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/
于 2009-08-25T20:16:15.530 に答える
20

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;
  }
}

?>
于 2012-11-28T08:45:42.957 に答える
10

試す

function validate_alphanumeric_underscore($str) 
{
    return preg_match('/^[a-zA-Z0-9_]+$/',$str);
}
于 2009-08-25T20:16:37.777 に答える
3

私にはうまく見えます。アンダースコアを配置する必要がないことに注意してください。したがって、「username_」と「___username」はどちらもパスします。

于 2009-08-25T20:17:54.560 に答える
1

連結としてアンダースコアのみを許可するために、gumboの2次正規表現を使用しますが、ユーザーが「special__username」のようになるように、_の後に+を追加します。

/^[A-Za-z][A-Za-z0-9]*(?:_+[A-Za-z0-9]+)*$/

于 2013-01-14T16:44:25.003 に答える
0

あなた自身の解決策はまったく問題ありません。

preg_matchPerl に似た正規表現を使用します。この正規表現では、文字クラス\wが必要なものと正確に一致するように定義されています。

\w- 「単語」文字に一致 (英数字と「_」)

ソース

于 2009-08-25T20:26:33.450 に答える