Regex去掉除单词和数字(以及拉丁字符)以外的所有内容


Regex to strip out everything but words and numbers (and latin chars)

我试图清理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
  • 需要转义的连字符(字符类末尾的''-而不是-(