0

我试图清理 ajax 请求中使用的 post 字符串(在 db 查询之前进行清理)以仅允许字母数字字符、空格(每个单词 1 个,而不是多个),可以包含“-”和拉丁字符,如“ç”和“é “没有成功,任何人都可以帮助或指出正确的方向吗?

这是我目前使用的正则表达式:

$string = preg_replace('/^[a-z0-9 àáâãäåçèéêëìíîïðñòóôõöøùúû-]+$/', '', mb_strtolower(utf8_encode($_POST['q'])));

谢谢你。

4

3 回答 3

4
$regEx = '/^[^\w\p{L}-]+$/iu';

\w- 匹配字母数字

\p{L}- 匹配“字母”类别中的单个 Unicode 代码点(请参阅此处的Unicode 类别部分)。

-在字符类的末尾匹配单个连字符。

^在字符类中否定字符类,因此正则表达式将匹配字符类的反面(您指定的任何内容)。

+在字符类之外说匹配 1 个或多个字符

^并且$在字符类之外将导致引擎仅接受从行首开始并一直到行尾的匹配。

在模式之后,i修饰符说忽略大小写,并且u告诉模式匹配引擎我们将按照这种方式发送 UTF8 数据,并且g最初存在的修饰符已被删除,因为它在 PHP 中不是必需的(而是全局匹配取决于哪个匹配函数被调用)

于 2011-08-08T13:52:17.877 回答
2
$string = mb_strtolower(utf8_encode($_POST['q'])));
$string = preg_replace('/[^a-z0-9 àáâãäåçèéêëìíîïðñòóôõöøùúû-]+/g', '', $string);
$string = preg_replace('/ +/g', ' ', $string);

为什么不直接使用 mysql_real_escape_string?

于 2011-08-08T13:35:37.990 回答
0
$string = preg_replace('/[^a-z0-9 àáâãäåçèéêëìíîïðñòóôõöøùúû\-]/u', '', mb_strtolower(utf8_encode($_POST['q']), 'UTF-8'));
$string = preg_replace( '/ +/', ' ', $string );

应该做的伎俩。注意

  • 通过将 ^放在字符类中来否定字符类
  • 在处理模式或主题中的 unicode 字符串时,您需要u标志
  • 最好在 mb_* 函数中明确指定字符集,否则它们将退回到您的系统默认值,并且可能不是 UTF-8。
  • 连字符需要转义(\- 而不是 - 在字符类的末尾)
于 2011-08-08T14:13:00.103 回答