2010-11-13 4 views
0

Я использую функцию preg_match для фильтрации нежелательных символов из текстовой области в 2 сценариях PHP, которые я сделал, но в одном из них, похоже, не работает.Функция preg_match не работает правильно в определенном скрипте 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 просто фильтровать нежелательные chracters как "# $% & /() и т.д ..

Но каждый раз, когда я . ввести специальный символ, как «N» или «а» это вызывает код ошибки

у меня есть этот очень похожий сценарий, который прекрасно работает с тем же 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......." 
?> 

Итак, вопрос в том, что я делаю неправильно в первом скрипте ??

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

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

+0

Распечатайте значение '$ comentario', прежде чем тестировать его с помощью' preg_match', убедитесь, что он содержит то, что, по вашему мнению, содержит. Мы не можем отлаживать это для вас, не зная, какие входные данные вы используете. – meagar

+0

Хорошо, дайте мне попробовать. – Danny

+0

I echo'd переменная до и после первого IF и печатает именно то, что я набрал, включая «ñ» и т. Д. Также, когда я добавляю вещи в preg_match, как 0-9, кажется, вносит правильные изменения и не делает 't фильтрует числа, единственная проблема на самом деле происходит только со специальными символами типа' - '. – Danny

ответ

1

попробовать добавить U в конце вместе с вашей я использовать Юникод

/[^a-zA-Z áéíóúüñÁÉÍÓÚÜÑ]/iu 
+0

Я добавил u, все еще принимает нежелательные символы. – Danny

+0

$ Номбр = "(adsfá"; если (preg_match ('/ [^ A-Za-Z áéíóúüñÁÉÍÓÚÜÑ]/ЕД', $ Номбр)) эхо "матч!"; работает для меня ... – KeatsKelleher

+0

Да , он работает, но теперь принимает любой символ, как! "# $% & /() =? и т. д. Я не хочу этих символов. – Danny

0

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

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

Теперь, похоже, сработало.

0

Почему вы указываете /i, но перечисляя все буквы верхнего и нижнего регистра отдельно?

ТАКЖЕ: Это не сработает, если вы не нормализуете свой ввод. Рассмотрим, как ñ может быть либо символом U + F1 , либо символов U + 4E, за которым следует U + 303!

  • Юникод Нормализация Форма D будет гарантировать, что оба U + F1 и U + 4E, U + 303 превращается в канонический разложенной форму U + 4E, U + 303.

  • Юникод Нормализация Форма C будет гарантировать, что оба U + F1 и U + 4E, U + 303 превращается в форму U + 4E, поскольку он использует каноническое разложение с последующим канонической композицией.

Основываясь на вашем шаблоне, похоже, что вы хотите форму NFC.

Из PHP вам необходимо использовать Normalization class, чтобы он работал надежно.

+0

Я знаю, что/i бесполезен в примере, но был предназначен только для демонстрации (вообще не влияет на мой preg_match). Во всяком случае, я уже исправил проблему, добавив в свою html-форму

. Не знаю, почему это исправило проблему, другая форма Я использую со вторым скриптом этот атрибут не имеет и работает без проблем. – Danny

1

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

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

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

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

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

Я добавил «\ ш», чтобы принять любое слово характера, а также добавил «и» после «/ я» для лечения шаблон как набор символов UTF-16 вместо UTF-8.

0

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