我正在使用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......."
?>
所以问题是,我在第一个脚本中做错了什么?
我尝试了一切,但总是失败并显示错误。
有什么建议吗?
答案 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)
答案 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()使它工作得很好。