0

我正在使用 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 只是过滤掉不需要的字符,例如 !"#$%&/() 等。

但每次我输入一个特殊字符,如“ñ”或“á”,它都会触发错误代码。

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

尝试在末尾添加 au 以及您的 i 以使用 unicode

/[^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-16 字符集,而不是 UTF-8。

于 2015-02-04T23:41:49.307 回答
0

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

于 2010-11-13T05:01:04.827 回答
0

我将此添加到表单中。

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

现在似乎工作了。

于 2010-11-13T05:27:07.413 回答
0

为什么要分别指定/i所有大写和小写字母?

另外:如果您不对输入进行规范化,这根本不起作用。考虑一下怎么ñ可能是字符 U+F1字符 U+4E 后跟 U+303!

  • Unicode 规范化形式 D将保证 U+F1 和 U+4E,U+303 都变成规范分解的形式 U+4E,U+303。

  • Unicode Normalization Form C将保证 U+F1 和 U+4E,U+303 都变成 U+4E 形式,因为它使用规范分解,然后是规范组合。

根据您的模式,您似乎需要 NFC 表单。

在 PHP 中,您需要使用这些Normalization以使其可靠地工作。

于 2010-11-13T14:18:16.340 回答
0

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

于 2015-03-25T18:18:09.010 回答