0

以前preg_match()はいくつかの特殊文字をブラックリストに登録していました。文字列にそのような特殊文字が含まれている場合は常に、無効な文字を返す必要があります。

$str = "adasdasasd*";
if(preg_match('/^[^~`!@#$%\^&\*\(\)]+$/',$str)) {
  echo "valid";
}
else {
  echo "invalid";
}

これは無効なを返しますが、これは正しいです。しかし、これまで私はこの否定とかなり混乱していpreg_matchます。誰かが否定について少なくとも簡単な説明をすることができますかpreg_match()?また、私が提供した正規表現にはpreg_match()欠点がありますか?

4

1 に答える 1

2

さて、正規表現には範囲指定子(この場合は)が含まれています[^~!@#$%\^&\*\(\)]+。これは少し複雑なので、とりあえず単純化してみましょう[abc]

[abc]おそらくご存知のように、a、b、またはcの任意の文字と一致します。最初に追加すると、^このセットが無効になるため、a、b、またはc以外のすべての文字に一致するため[^abc] d 、e、f、g、H、4、£などに一致します。

あなたの場合、あなたはあなたの特殊文字のリストにないものすべてに一致しています。「文字列の先頭に一致し、次に1つ以上の「非特殊」文字に一致し、次に文字列の終了に一致する」と言っています。特殊文字がある場合、「非特殊」文字の一致などと一致させることはできないため、正規表現は失敗します。

于 2012-10-14T11:45:21.300 に答える