1

メッセージを検証する次のコードがあります。メッセージが有効でない場合でも、メッセージは渡され、true が返されます。

コード:

$message = "abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890 \" ' ! & ( ) @ [ ] ? . : , ; - _";

if(isset($message) && strlen($message) > 10)
{
  if (preg_match("/[a-zA-Z0-9 \"'!&()@[\]\?.:,;\-_]/u", $message)) 
  { 
    return true;
  }
  else
  {
    return false;   
  }
}
else
{
  return false;
}

現在のコードは true として渡されるはずです。すべての文字は有効ですが、メッセージを変更すると

$message = "abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890 \" ' ! & ( ) @ [ ] ? . : , ; - _ >";

最後の文字で失敗するはずです。しかし、それは通過し、true を送信します。何かを見逃しているか、何かをエスケープしていない可能性があります。

最終的に、メッセージは HTML フォームを介して送信されます。

アップデート:

正規表現をに変更する

preg_match("/^[a-zA-Z0-9 \"'!&()@[]\?.:,;-_]+$/u", $メッセージ)

また

if (preg_match("/^[a-zA-Z0-9 \"'!&()@[\]\?.:,;\-_]*$/u", $message))

検証を修正しました。複数の文字が出現することを考慮していませんでした。

4

3 に答える 3

0

文字列の先頭文字 (^)、文字列末尾文字 ($)、および * を追加して、文字列内で複数の文字が出現することを示す必要があります。メッセージ文字列に複数のスペースがあります。

if (preg_match("/^[a-zA-Z0-9 \"'!&()@[\]\?.:,;\-_]*$/u", $message))
于 2013-07-04T11:27:07.387 に答える
0

あなたの正規表現は、文字のいずれかを含む任意の文字列を示しています

"a-zA-Z0-9 \"'!&()@[]\?.:,;-_"

有効になります。しかし実際には、文字列に他のシンボルが含まれているかどうかを調べる必要があります。これを行うには、sybmols クラスの先頭に「^」を置き、文字列が正規表現と一致しないことを確認します。ここにコード:

if(isset($message) && strlen($message) > 10) {
if (!preg_match("/[^a-zA-Z0-9 \"'!&()@[\]\?.:,;\-_]/u", $message)) { 
return true;
}
else {
return false; 
}
}
else {
return false;
}

または、これで正規表現を変更するだけです-

"/^[a-zA-Z0-9 \"'!&()@[]\?.:,;-_]+$/u",

リテラルを追加した場所:

^ - begin of the string,
+ - quantifier, which means, that there must be at least 1 symbol (you can use *, as well, cause you check lenght of the string),
$ - end of the string.

アドバイス - チェック

于 2013-07-05T12:15:30.840 に答える