質問

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

$pattern = webmaster|admin|webadmin|sysadmin

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

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

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

//許可されない

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

役に立ちましたか?

解決

正規表現をまったく使用しないのはどうですか?
そして、 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:。正規表現を使用する場合は、次のことを知っておく必要があります。

  • ^ は文字列の先頭をマークします
  • and $ は文字列の終わりを示します

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

$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

おそらく [および] は使用したくないでしょう。つまり、「文字列全体ではなく、「私たちの間にある任意の文字」」を意味します。間」&quot;。

そして、リファレンスとして: preg構文のマニュアル;-)

他のヒント

では、禁止された単語はユーザー名の一部になりますが、全部ではありませんか?

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

 Allowed = Not RegEx.Match("admin", "^(webmaster|admin|webadmin|sysadmin)<*>quot;)

&quot; ^&quot;文字列の先頭の&quot; $&quot;と一致します最後に一致するため、これらの単語のいずれかと完全に一致するものを探します。私は、対応するPHP構文について少しあいまいです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top