0

PHPで正規表現を記述して、 &または@以外の句読点を含む英数字の文字列を許可しました。基本的に、これら2つの文字を除いて、標準のアメリカンキーボードですべてを許可する必要があります。次の正規表現を思い付くのに少し時間がかかりました。これは、必要なことを実行しているようです。

if (ereg("[^]A-Za-z0-9\[!\"#$%'()*+,./:;<=>?^_`{|}~\-]", $test_string)) {
  // error message goes here
}

それは私の質問に私をもたらします...より良い、より簡単な、またはより効率的な方法はありますか?

4

3 に答える 3

3

文字範囲を見てください:

@[!-%'-?A-~]+@

& (\0x26)これにより、文字とが除外され@ (0x40)ます。ASCIIテーブルを見ると、これがどのように機能するかがわかります。感嘆符はASCIIセットの最初の文字であり、空白ではありません。%次に、アンパサンドの直前にある文字までのすべてに一致します。次に、との間にある文字までの次の@範囲。その後、すべてを標準のASCII文字セットの最後に一致させます。?A~

アップデート

読みやすくするために、これを2つの手順で行うことも検討してください。最初に、デフォルトのASCII範囲外のものをフィルタリングします。

@[!-~]+@

2番目のステップでは、不要な文字をフィルタリングするか、単に文字に対してastr_posを実行します。

最後に、それをあなたが始めたものと比較して、それが望ましくない文字を含んでいるかどうかを確認することができます。

代わりに、このような正規表現を2番目のステップに使用することもできます。 /[^@&]+/

手順は互換性があり、不良文字を特定するための最初の手順として、@または最初の手順としてstr_posを実行すると、パフォーマンスが向上する可能性があります。&

于 2010-12-17T07:35:40.240 に答える
1

これはどうですか:

[^&@]

preg_match

$str = 'a';
var_dump(preg_match('~^[^&@]+$~', $str)); // true

$str = '&';
var_dump(preg_match('~^[^&@]+$~', $str)); // false

$str = '!';
var_dump(preg_match('~^[^&@]+$~', $str)); // true
于 2010-12-17T07:10:42.533 に答える
0

すべての英数字をテストするのではなく、@と&をチェックして、notを使用できると思いますか?

$reg = '/@|&/';
if(!preg_match($reg, "YOUR STRING CAN GO HERE")){
// your code goes here
}
于 2010-12-17T07:33:35.750 に答える