【问题标题】:Regex to strip out everything but words and numbers (and latin chars)正则表达式去除除单词和数字(以及拉丁字符)之外的所有内容
【发布时间】:2011-08-08 13:34:08
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

    标签: php regex punctuation


    【解决方案1】:
    $regEx = '/^[^\w\p{L}-]+$/iu';
    

    \w - 匹配字母数字

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

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

    字符类中的

    ^ 否定字符类,因此正则表达式将匹配字符类的反面(您所做的任何事情指定)。

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

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

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

    【讨论】:

    • 嗨,还没有测试过这个,但它看起来真的让我很困惑,因为我还在学习如何使用正则表达式:) 无论如何谢谢!!
    【解决方案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?

    【讨论】:

    • 嗨,谢谢,这个工作正常,只是改变了分隔符 $string = mb_strtolower($this->input->post('q')); $string = preg_replace('%/[^a-z0-9 àáâãäåçèéêëìíîïðñòóôõöøùúû-]+/g%', '', $string); $string = preg_replace('%/ +/g%', ' ', $string);我没有使用 mysql_real_escape_string,因为我使用的是 codeigniter,所以所有内容都在框架上转义,但这与此事无关。谢谢。
    【解决方案3】:
    $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-09-08
      • 1970-01-01
      • 1970-01-01
      • 2019-11-12
      • 2021-07-11
      • 2011-10-16
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多