0

preg_match関数を使用して、作成した2つのPHPスクリプトのテキストエリアフォームから不要な文字をフィルタリングしていますが、そのうちの1つでは機能しないようです。

問題のあるスクリプトは次のとおりです。

<?php
    //Database connection, etc......

    mysql_select_db("etc", $con);
    $errmsg = '';
    $chido = $_POST['chido'];
    $gacho = $_POST['gacho'];
    $maestroid = $_POST['maestroid'];
    $comentario = $_POST['comment'];
    $voto = $_POST['voto'];

    if($_POST['enviado']==1) {
        if (preg_match ('/[^a-zA-Z áéíóúüñÁÉÍÓÚÜÑ]/i', $comentario))
            $errmsg = 1;
        if($errmsg == '') {
            //here's some queries, etc
        }
    }

    if($errmsg == 1)
        echo "ERROR: You inserted invalid characters...";
?>

ご覧のとおり、preg_matchは、! "#$%&/()などの不要な文字をフィルタリングするだけです。

ただし、「ñ」や「á」などの特殊文字を入力するたびに、エラーコードがトリガーされます。

同じpreg_matchで完全に機能し、不要な文字だけをフィルタリングする、この非常によく似たスクリプトがあります。

//Database connection, etc..
mysql_select_db("etc", $con);
$errmsg = '';

if ($_POST['enviado']==1) {
     $nombre = $_POST['nombre'];
     $apodo = $_POST['apodo'];
     $mat1 = $_POST['mat1'];
     $mat2 = $_POST['mat2'];
     $mat3 = $_POST['mat3'];

     if (preg_match ('/[^a-zA-Z áéíóúüñÁÉÍÓÚÜÑ]/i', $nombre))
         $errmsg = 1;


     if($errmsg == '') {
         //more queries after validation
     }
}

if($errmsg == 1)
    echo "ERROR: etc......."
?>

だから問題は、最初のスクリプトで何が間違っているのかということです。

私はすべてを試しましたが、常に失敗し、エラーが表示されます。

なにか提案を?

4

6 に答える 6

1

Unicodeを使用するには、iと一緒に最後にauを追加してみてください

/[^a-zA-Z áéíóúüñÁÉÍÓÚÜÑ]/iu
于 2010-11-13T05:05:54.333 に答える
1

こんにちは、この一致式を使用する前に:

/^[a-z]\d_]+$/i

a から z までの文字、0 から 9 までの数字、アンダースコア '_'、文字列全体を繰り返すプラス記号 '+'、および区別されない一致の '/i' を受け入れていたためです。しかし、「ñ」の文字を受け入れる必要がありました。

だから、私が試してうまくいったのは、この正規表現を使用することでした:

/^[a-z\d_\w]+$/iu

「\w」を追加して任意の単語文字を受け入れ、「/i」の後に「u」を追加して、パターンを UTF-8 ではなく UTF-16 文字セットとして扱いました。

于 2015-02-04T23:41:49.307 に答える
0

これは役立つかもしれません:http ://www.phpwact.org/php/i18n/charsets

于 2010-11-13T05:01:04.827 に答える
0

これが役立つかどうかはわかりませんが、これらの種類の特殊文字でまったく同じ問題があり、最後に何日も夢中になりました。問題は、実行する前に文字列をサニタイズする html_entities() コマンドであることがわかりましたpreg_match()、prey_match() の後に html_entities() を移動すると、うまく機能しました。

于 2015-03-25T18:18:09.010 に答える
0

/i大文字と小文字をすべて別々に列挙しているのに、なぜ指定しているのですか?

また、入力を正規化しないと、これはまったく機能しません。ñ文字 U+F1または文字 U+4E の後に U+303 が続く方法を考えてみましょう!

  • Unicode 正規化フォーム Dは、U+F1 と U+4E,U+303 の両方が標準的に分解されたフォーム U+4E,U+303 になることを保証します。

  • Unicode 正規化形式 Cは、U+F1 と U+4E、U+303 の両方が形式 U+4E に変わることを保証します。これは、正規分解とそれに続く正規合成を使用するためです。

パターンに基づいて、NFC フォームが必要なようです。

PHP から、確実に動作させるには、これらのNormalizationクラスを使用する必要があります。

于 2010-11-13T14:18:16.340 に答える
0

これをフォームに追加しました。

<form accept-charset="utf-8">. 

今はうまくいくようです。

于 2010-11-13T05:27:07.413 に答える