Функция preg_match не работает правильно в некоторых скриптах PHP - PullRequest
0 голосов
/ 13 ноября 2010

Я использую функцию preg_match для фильтрации нежелательных символов из формы textarea в 2 PHP-скриптах, которые я сделал, но в одном из них, похоже, не работает.

Вот скрипт с проблемой:

<?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......."
?>

Итак, вопрос в том, что ячто-то не так в первом скрипте ??

Я пробовал все, но всегда терпел неудачу и выдает ошибку.

Любое предложение?

Ответы [ 6 ]

1 голос
/ 05 февраля 2015

Привет, прежде чем я использовал это выражение:

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

потому что я принимал буквы от a до z, цифры от 0 до 9 и подчеркивание '_', знак плюса '+' для повторения через всю строку и '/ i' для нечувствительного совпадения. Но мне нужно было принять букву «-».

Итак, что я пытался и работал для меня, использовал это регулярное выражение:

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

Я добавил '\ w', чтобы принять любой символ слова, а также добавил 'u' после '/ i', чтобы рассматривать шаблон как набор символов UTF-16 вместо UTF-8.

1 голос
/ 13 ноября 2010

попробуйте добавить au в конце вместе с вашим i, чтобы использовать Unicode

/[^a-zA-Z áéíóúüñÁÉÍÓÚÜÑ]/iu
0 голосов
/ 25 марта 2015

я не знаю, может ли это помочь, но у меня была точно такая же проблема с такими специальными символами, и в конце концов я с ума сошел на много дней в конце, я понял, что проблема была в команде html_entities (), очищающей строку перед запуском в preg_match (), перемещение html_entities () после prey_match () сделало его отлично работающим.

0 голосов
/ 13 ноября 2010

Почему вы указываете /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 класс для них, чтобы он работал надежно.

0 голосов
/ 13 ноября 2010

Я добавил это в форму.

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

Теперь, кажется, работает.

0 голосов
/ 13 ноября 2010

Это может помочь: http://www.phpwact.org/php/i18n/charsets

...