3

正直なところ、私は実際には正規表現を取得していませ。だから私はここでどこが間違っているのか完全に気づいていません。

英数字のみを受け入れる正規表現を探しています(アンダースコアはユーザー名用です)。この辺りを検索したところ、試した正規表現の例が多数見つかりましたが、そのうちの1つは機能していません。

なかでも、このあたりの回答から得たものが多いので、やってみました

^[a-zA-Z0-9_]*$
/[^a-z_\-0-9]/i
/^\w+$/

これらに一致させるために、私は(各正規表現で)試しました

   if(preg_match("/^\w+$/", $username)) { 
     //don't accept 
   }

 if(!preg_match("/^\w+$/", $username)) {
      //don't accept
    }

if(preg_match("/^\w+$/", $username) == 1) {
      //don't accept
    }

if(preg_match("/^\w+$/", $username) == 0) {
  //don't accept
}

など...特殊文字を受け入れるたびに(&、$、^、および%を試しました)。

私はここで何を間違っているのですか?正規表現の形式ですか?それは私がそれをチェックするように頼んでいる方法ですか?

また、特殊文字が見つかった場合に取得するリターンタイプは正確には何ですか?(つまり、受け入れたくないもの)

4

4 に答える 4

7

preg_match入力文字列が指定したパターンと一致した場合は1を返し、一致しなかった場合は0を返します。

ユーザー名の各文字を英数字(およびアンダースコア)にする必要があります。これを表現するPCREの方法の1つは、次のように角かっこで囲まれた文字クラス[A-Za-z0-9_]を使用することです。この基本クラスを使用して、必要なことを実行する方法はいくつかあります。

1つの方法は、「ネガティブ」検索です。英数字以外の文字を一致させようとすると、テストは失敗します。このために、キャラクタークラスの前にカラットを追加するだけです。これは、そのセットにない文字と一致していることを意味します。

したがって、次のパターンは「英数字、アンダースコア以外の文字」と一致します。ここで、一致は無効なユーザー名を意味します。

if (preg_match('/[^A-Za-z0-9_]/',  $username)) {
    // invalid username
}

または、反対の種類の一致を実行して、有効なユーザー名のパターンを指定し、それと一致するかどうかを確認することもできます。今回は、文字クラス自体はまったく変更しませんが、+その後に数量詞を追加します。つまり、1つ以上の「適切な」文字と一致します。

^さらに、文字列の開始と$終了のアンカーをパターンにラップします。(少し紛らわしいですが、パターンの先頭のカラットは、括弧内の文字クラスの先頭のカラットとはまったく異なる意味を持っています)。

最終結果は、「1つ以上の英数字(およびアンダースコア)とそれ以外は何もない」という意味のパターンになります。これに一致する場合は、有効なユーザー名を意味します。

if (preg_match('/^[A-Za-z0-9_]+$/', $username)) {
    // valid username
}
于 2013-01-05T00:12:31.420 に答える
2
if (preg_match("^[a-zA-Z0-9_]+$", $username) === 1) {
    // Good username
}
else {
    // Bad username
}

厳密な等式演算子(===)を使用するということは、preg_match()が返す値をブール値ではなく数値の1に比較していることを意味します。0を返す場合は、一致がないこと、ブール値のfalse、エラーが発生したことを意味します。詳細については、次のページを確認してください:http preg_match: //php.net/manual/en/function.preg-match.php

于 2013-01-05T00:09:48.453 に答える
0

PHPのマニュアルによると、 * preg_match *は、正規表現との一致が見つからない場合は0を返し、エラーが発生した場合はFALSEを返します。したがって、falseと評価できるものではなく、0をテストしていることを確認したい場合は、===演算子を使用する必要があります。

文字とアンダースコアのみが必要な場合は[a-z_]、aからzまでの文字の範囲と_記号が一致することを指定する文字クラスを使用できます。そして、+次のクラスは、同じものの1つまたは複数が必要であることを指定します。は^、パターンがテキストの最初から一致する必要がある$と述べていますが、パターンはテキストの最後まで一致する必要があると述べています。

if (preg_match("/^[a-z_]+$/i", $text_variable) === 1) {
    //"A match was found.";
} else {
    //"A match was not found.";
}
于 2013-01-05T00:10:35.693 に答える
0

基本を理解すれば、正規表現は非常に理解しやすいです:)

私はあなたが試した3つの表現すべてをあなたに説明しようとします:

  1. ^ [a-zA-Z0-9 _] * $を使用すると、文字列が一致します。

    ^ // from the beginning...
    
    [a-zA-Z0-9_] // contains only characters a-z or A-Z or 0-9 or _ sign
    
    * // and has 0 or more of such characters
    
    $ // to the end
    

    一致した文字列の例:

    (empty string - since you told 0 or more characters)
    abc09
    fidjwieofoj4fio3j4fiojrfioj3ijfo
    000000000000000000000
    __________
    and_many_many_more_as_long_as_they_contain_alpha_characters_and___sign
    
  2. / [^ a-z_-0-9] / iを使用すると、文字列が一致します。

    [^a-z_\-0-9]
    // ^ means "the opposite" so that subset describes characters
    // which are not included in it
    // (are not a-z or _ sign, or - dash sign, or 0-9 numbers)
    
    i modifier
    // stands for case insensitive, all letters are treated as lowercase
    

    *または?を追加しませんでした またはサブセットの後、基本的に1つの文字のみを検索し、正規表現を^記号と$記号の間に配置しなかったため、この式は、AZまたはaz以外の文字を少なくとも1つ含むテキストに最終的に一致します。 _記号、または-ダッシュ記号、または0〜9の数字。

    一致した文字列の例:

    !
    a>a
    A<9
    ffffffffff.dflskfdfd
    00000,
    ]]]]]]]]]]]]]]]]]]
    and so-on
    
  3. / ^ \ w + $ /を使用すると、文字列が一致します。

    ^ // from the beginning
    \w // contains only characters a-z or A-Z or 0-9 or _ sign
    + // and the string must be at least 1 character long
    $ // to the end
    

    おそらく最も有用な正規表現。\wは[a-zA-Z0-9_]の単なるエイリアスであることを忘れないでください。この正規表現は、空ではなく、英数字と_記号のみを含む文字列全体にのみ一致します。

    一致した文字列の例:

    mike
    alice
    bob10
    0000000000
    1111
    9
    php
    user_example
    

お役に立てば幸いです。有効なユーザー名に一致する最も有用な式imvhoは、/ ^ \ w {3,15} $ /です。これは、3〜15文字の長さで、英数字とアンダースコア記号(az AZ)のみで構成される任意の文字列に一致するためです。 0-9 _)。

これを試して:

<?php

function isValidUsername($username)
{
    return preg_match('/^\w{3,15}$/', $username) == 1;
}

echo isValidUsername('mike999') ? 'Yes' : 'No' , '<br>';
echo isValidUsername('alice!') ? 'Yes' : 'No';

乾杯。

于 2013-01-05T01:08:28.870 に答える