1

これが私のコードです:

//Validate names have correct characters
if (preg_match("/^[a-zA-Z\s-]+$/i", $_POST['first']) == 0) {
  echo '<p class="error">Your first name must only include letters,
        dashes, or spaces.</p>';
  $okay = FALSE;
}

if(preg_match("/^[a-zA-Z\s-]+$/i", $_POST['last']) == 0) {
  echo '<p class="error">Your last name must only include letters, 
        dashes, or spaces.</p>';
  $okay = FALSE;
}

数字以外のすべてを受け入れるようにこのコードを変更するにはどうすればよいですか?

4

2 に答える 2

2

ヴェドランが最も正しかった。は\d数字を意味し、大文字は非数字を意味し\Dます。したがって、次のようになります。

if (preg_match("/\d/i", $_POST['first']) > 0) {
  echo '<p class="error">Digits are not allowed, please re-enter.</p>';
  $okay = FALSE;
}

上記の意味は...数字が見つかったら...エラーを実行してください。別名: 数字以外のすべてを許可します。

ただし...「数字以外のすべて」を許可するには、アイデアを再考する必要があると思います。通常、ユーザーが引用符や ACII 特殊文字を入力することは望ましくありませんが、入力できるようにしたいようです-!@#$%^&*()_+=|}{\][:;<>?,./~

これは長いリストのように思えますが、可能な文字の完全なリストと比較すると、それほど長くはありません。そのため、より多くの作業が必要に思えますが、次のようにすることをお勧めします。

if (preg_match("/[^-~`!@#$%^&*()+={}|[]\:;<>?,.\w]/i", $_POST['first']) > 0) {
echo '<p class="error">ASCII and Quotes are not accepted, please re-enter.</p>';
$okay = FALSE;
}

これらのチェックの発生 (または発生しない) について文字列内の任意の場所を探しているため、これらのいずれにも Beginning/End-Line 特殊文字はありません。

比較演算子を (if greater than) に変更しました。これは、エラーをスローするのに必要なものが不足していることを探すのではなく、エラーをスローするのに悪いものの存在を探しているからです。

また、最後の正規表現からアンダースコアを削除しました...単語文字 (\w) には数字、文字、およびアンダースコアが含まれているためです。最後に、文字クラスのダッシュは、リストの最初または最後でなければなりません。そうしないと、エラーが発生したり、誤って範囲文字と間違えられたりすることがあります。

于 2013-06-09T16:24:20.463 に答える