我试图清理ajax请求中使用的post字符串(在数据库查询之前进行消毒(,只允许字母数字字符、空格(每个单词1个,而不是多个(、可以包含"-"以及拉丁字符(如"ç"answers"é"(,但没有成功,有人能帮助我或为我指明正确的方向吗?
这是我目前使用的正则表达式:
$string = preg_replace('/^[a-z0-9 àáâãäåçèéêëìíîïðñòóôõöøùúû-]+$/', '', mb_strtolower(utf8_encode($_POST['q'])));
谢谢。
$regEx = '/^[^'w'p{L}-]+$/iu';
'w
-匹配字母数字
'p{L}
-匹配"字母"类别中的单个Unicode代码点(请参阅此处的Unicode类别部分(。
字符类末尾的-
与单个连字符匹配。
字符类中的^
否定字符类,这样regex将匹配字符类的相反项(您所做的而不是指定的任何操作(。
字符类之外的+
表示匹配1个或多个字符
字符类之外的^
和$
将导致引擎只接受从行首开始一直到行尾的匹配。
在模式之后,i
修饰符表示忽略大小写,u
修饰符告诉模式匹配引擎我们将按此方式发送UTF8数据,并且最初存在的g
修饰符已被删除,因为它在PHP中没有必要(相反,全局匹配取决于调用哪个匹配函数(
$string = mb_strtolower(utf8_encode($_POST['q'])));
$string = preg_replace('/[^a-z0-9 àáâãäåçèéêëìíîïðñòóôõöøùúû-]+/g', '', $string);
$string = preg_replace('/ +/g', ' ', $string);
为什么不直接使用mysql_real_sescape_string呢?
$string = preg_replace('/[^a-z0-9 àáâãäåçèéêëìíîïðñòóôõöøùúû'-]/u', '', mb_strtolower(utf8_encode($_POST['q']), 'UTF-8'));
$string = preg_replace( '/ +/', ' ', $string );
应该做到这一点。注意
- 通过将^放在字符类内部来否定字符类
- 在模式或主题中处理unicode字符串时,需要u标志
- 最好在mb*函数中显式指定字符集,否则它们将依赖于系统默认值,而且可能不是UTF-8
- 需要转义的连字符(字符类末尾的''-而不是-(