1

次のようなパターン変数に設定されたニックネームとして使用するのは違法である単語の小さなリストを持つパターンがあります。

$pattern = webmaster|admin|webadmin|sysadmin

を使用してpreg_match、これらの単語のニックネームを禁止するようにするにはどうすればよいですか。ただし、「admin2」や「」などの登録thesysadminは許可されますか?

これは私がこれまでに持っている表現です:

preg_match('/^['.$pattern.']/i','admin');

//許可されるべきではありません

注:を使用して\bもあまり役に立ちませんでした。

4

2 に答える 2

3

正規表現をまったく使用しないのはどうですか?
そして、と一緒explodeに働いていin_arrayますか?

たとえば、これは次のようになります。

$pattern = 'webmaster|admin|webadmin|sysadmin';
$forbidden_words = explode('|', $pattern);

|を使用して、パターンを配列に分解します。セパレーターとして。


この :

$word = 'admin';
if (in_array($word, $forbidden_words)) {
    echo "<p>$word is not OK</p>";
} else {
    echo "<p>$word is OK</p>";
}

あなたを取得します

admin is not OK

これに対して(同じコード;単語のみが変更されます)

$word = 'admin2';
if (in_array($word, $forbidden_words)) {
    echo "<p>$word is not OK</p>";
} else {
    echo "<p>$word is OK</p>";
}

あなたを取得します

admin2 is OK

このように、完全な単語に一致するために、適切な正規表現を見つけることを心配する必要はありません:それは正確な単語に一致するだけです;-)


編集: 1つの問題は、比較で大文字と小文字が区別されることです:-(
すべてを小文字で操作すると、大文字と小文字が区別されます:

$pattern = strtolower('webmaster|admin|webadmin|sysadmin');  // just to be sure ;-)
$forbidden_words = explode('|', $pattern);

$word = 'aDMin';
if (in_array(strtolower($word), $forbidden_words)) {
    echo "<p>$word is not OK</p>";
} else {
    echo "<p>$word is OK</p>";
}

あなたを取得します:

aDMin is not OK

(私はi私の答えを投稿した後にのみ正規表現で''フラグを見ました;それで、それを編集しなければなりませんでした)


編集2:そして、本当に正規表現でそれをやりたいのなら、あなたはそれを知る必要があります:

  • ^文字列の始まりを示します
  • $文字列の終わりをマークします

だから、このようなことをする必要があります:

$pattern = 'webmaster|admin|webadmin|sysadmin';

$word = 'admin';
if (preg_match('#^(' . $pattern . ')$#i', $word)) {
    echo "<p>$word is not OK</p>";
} else {
    echo "<p>$word is OK</p>";
}

$word = 'admin2';
if (preg_match('#^(' . $pattern . ')$#i', $word)) {
    echo "<p>$word is not OK</p>";
} else {
    echo "<p>$word is OK</p>";
}

かっこはおそらく必要ありませんが、必要なものを分離するためにかっこを使用するのが好きです。

そして、あなたは同じ種類の出力を得るでしょう:

admin is not OK

admin2 is OK

あなたはおそらく使いたくないでしょう:それらは「私たちの間にあるすべての文字」を意味し[]「私たちの間にある文字列全体」を意味するのではありません。

そして、参考として:preg構文のマニュアル;-)

于 2009-08-05T17:54:14.683 に答える
0

それで、禁止されている単語はユーザー名の一部にすることができますが、全部ではありませんか?

.NETでは、パターンは次のようになります。

 Allowed = Not RegEx.Match("admin", "^(webmaster|admin|webadmin|sysadmin)$")

「^」は文字列の先頭に一致し、「$」は末尾に一致するため、これらの単語の1つに完全に一致するものを探します。対応するPHP構文について少し曖昧です。

于 2009-08-05T17:53:01.613 に答える