preg_match函数在某些PHP脚本中无法正常工作

时间:2010-11-13 04:36:39

标签: php regex utf-8 preg-match unicode-normalization

我正在使用preg_match函数在我制作的2个PHP脚本中从textarea表单中过滤掉不需要的字符,但其中一个似乎不起作用。

这是带问题的脚本:

<?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只是过滤掉不需要的字符,比如!“#$%&amp; /()等等。

但每次我输入'ñ'或'á'等特殊字符时,都会触发错误代码。

我有这个非常相似的脚本,它与同一个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 个答案:

答案 0 :(得分:1)

尝试在最后添加一个你的i以使用unicode

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

答案 1 :(得分:1)

在我使用这个匹配表达式之前:

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

因为我接受a到z的字母,0到9的数字和下划线'_',加号'+'重复整个字符串,'/ i'表示不敏感的匹配。但我需要接受'''字母。

所以,我为我尝试和工作的是使用这个正则表达式:

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

我添加'\ w'接受任何单词字符,并在'/ i'之后添加'u'将模式视为UTF-16字符集,而不是UTF-8。

答案 2 :(得分:0)

这可能会有所帮助:http://www.phpwact.org/php/i18n/charsets

答案 3 :(得分:0)

我将此添加到表单中。

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

现在似乎有效。

答案 4 :(得分: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 class来使其可靠运行。

答案 5 :(得分:0)

我不知道这是否有所帮助,但我对这些特殊字符有完全相同的问题,并且最终让我疯了很多天我明白问题是html_entities()命令清理字符串在preg_match()中运行之前,在prey_match()之后移动html_entities()使它工作得很好。