正则表达式删除除了单词和数字(和拉丁字符)之外的所有内容

时间:2011-08-08 13:34:08

标签: php regex punctuation

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

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

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

谢谢。

3 个答案:

答案 0 :(得分:4)

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

\w - 匹配字母数字

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

字符类末尾的

-匹配单个连字符。

字符类中的

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

字符类之外的

+表示匹配1个或多个字符

字符类之外的

^$将使引擎仅接受从行开头开始直到行结束的匹配。

在模式之后,i修饰符表示忽略大小写,u告诉模式匹配引擎我们将发送UTF8数据,并且g修饰符最初present已被删除,因为在PHP中没有必要(而全局匹配取决于调用哪个匹配函数)

答案 1 :(得分: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?

答案 2 :(得分: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。
  • 需要转义的连字符(\ - 而不是 - 在你的角色类的末尾)