0

ajax リクエスト (db クエリの前にサニタイズ) で使用される投稿文字列をクリーンアップして、英数字、スペース (単語ごとに 1 つ、複数ではありません)、「-」、および「ç」や「é」などのラテン文字のみを許可しようとしています。 "成功せずに、誰かが私を助けたり、正しい方向に向けたりすることはできますか?

これは私がこれまでに使用している正規表現です:

$string = preg_replace('/^[a-z0-9 àáâãäåçèéêëìíîïðñòóôõöøùúû-]+$/', '', mb_strtolower(utf8_encode($_POST['q'])));

ありがとうございました。

4

3 に答える 3

4
$regEx = '/^[^\w\p{L}-]+$/iu';

\w-英数字に一致します

\p{L}-「文字」カテゴリの単一のUnicodeコードポイントに一致します(ここの「 Unicodeカテゴリ」セクションを参照)。

-文字クラスの最後にあるのは、単一のハイフンと一致します。

^文字クラスでは、文字クラスが無効になるため、正規表現は文字クラスの反対(指定しないもの)と一致します。

+文字クラスの外では、1つ以上の文字に一致すると表示されます

^キャラクタークラスの$外では、エンジンは行の先頭から始まり、行の終わりまで続く一致のみを受け入れます。

パターンの後、i修飾子は大文字と小文字を区別しないことuを示し、パターンマッチングエンジンにUTF8データを送信することを通知します。またg、PHPでは必要ないため、元々存在していた修飾子は削除されています(代わりに、グローバルマッチングはマッチング関数が呼び出されます)

于 2011-08-08T13:52:17.877 に答える
2
$string = mb_strtolower(utf8_encode($_POST['q'])));
$string = preg_replace('/[^a-z0-9 àáâãäåçèéêëìíîïðñòóôõöøùúû-]+/g', '', $string);
$string = preg_replace('/ +/g', ' ', $string);

mysql_real_escape_string を使用しないのはなぜですか?

于 2011-08-08T13:35:37.990 に答える
0
$string = preg_replace('/[^a-z0-9 àáâãäåçèéêëìíîïðñòóôõöøùúû\-]/u', '', mb_strtolower(utf8_encode($_POST['q']), 'UTF-8'));
$string = preg_replace( '/ +/', ' ', $string );

トリックを行う必要があります。ご了承ください

  • 文字クラスは、文字クラスに ^ を入れることによって否定されます
  • パターンまたはサブジェクトで Unicode 文字列を処理する場合は、 uフラグが必要です。
  • mb_* 関数で文字セットを明示的に指定することをお勧めします。そうしないと、システムのデフォルトにフォールバックし、UTF-8 ではない可能性があるためです。
  • ハイフン文字をエスケープする必要がありました (文字クラスの最後に - の代わりに \- を使用)
于 2011-08-08T14:13:00.103 に答える