2010-11-13 133 views
0

我正在使用preg_match函数从2个PHP脚本中的textarea窗体中过滤不需要的字符,但在其中一个脚本中似乎不起作用。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比如“#$%& /()等。

但每次我键入一个特殊的字符,如'ñ'或'á'它触发错误代码

我有这个非常相似的脚本,完美地使用相同的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

在用'preg_match'测试之前,打印'$ comentario'的值,确保它包含你认为它包含的内容。我们不能在不知道您使用的输入的情况下为您进行调试。 – meagar 2010-11-13 04:50:19

+0

好吧,让我试试。 – Danny 2010-11-13 04:51:26

+0

我在第一个IF之前和之后回显变量,并打印出我输入的内容,包括'ñ'等。 另外,当我将事件添加到像0-9这样的preg_match似乎做出了正确的更改,不过滤数字,唯一的问题实际上只发生在像'ñ'这样的特殊字符上。 – Danny 2010-11-13 04:55:56

回答

1

尝试在结束与你我使用unicode

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

我加了你,仍然接受不需要的字符。 – Danny 2010-11-13 05:08:28

+0

$农布雷= “(adsfá”; 如果(的preg_match( '/ [^ A-ZA-ZáéíóúüñÁÉÍÓÚÜÑ]/IU',$农布雷)) 回声 “的比赛!”; 作品对我来说... – KeatsKelleher 2010-11-13 05:10:52

+0

是,它可以工作,但现在可以接受任何字符,比如!“#$%&/()=?等等。我不想要那些字符。 – Danny 2010-11-13 05:17:16

0

我已将此添加到表单一起加入U形。

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

现在似乎工作。

0

你为什么要指定/i还要分别枚举所有的大小写字母?

ALSO:如果您没有对输入进行规范化处理,则完全不起作用。考虑ñ既可以是字符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 class让它工作可靠。

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

因为我接受字母从a到z,数字从0到9和下划线“_”,加号“+”来重复通过:我使用此匹配表达式之前

+0

我知道/ i在示例中是无用的,但仅用于演示目的(根本不影响我的preg_match)无论如何,我已经解决了添加到我的html表单的问题

我不知道为什么这个问题解决了,另一个表单我使用的第二个脚本没有这个属性,工作没有问题。 – Danny 2010-11-13 22:52:51

1

您好整个字符串,和'/我'进行不敏感的匹配。但我需要接受这封信。

所以,我尝试了,对我的工作就是用这个正则表达式:

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

我加了“\ W”接受任何单词字符,并且还增加了一个“U”后'/ I治疗该模式为UTF-16字符集,而不是UTF-8。

0

我不知道这是否可以帮助,但我有那些特殊字符完全相同的问题,并在最后让我疯了很多天我明白,问题是一个html_entities()命令消毒在preg_match()中运行之前的字符串,在prey_match()之后移动html_entities()使其工作得很好。