【问题标题】:PHP - regex to allow unicode charcatersPHP - 正则表达式允许 unicode 字符
【发布时间】:2017-05-01 16:31:25
【问题描述】:

我正在使用以下带有 preg_replace 的正则表达式来过滤输入:

/[^A-Za-z0-9[:space:][:blank:]_<>=@#£€$!?:;%,.\\'\\\"()&+\\/-]/

但是这不允许像变音符号这样的重音字符,所以我将其更改为:

/[^\w[:space:][:blank:]_<>=@#$£€!?:;%,.\\'\\\"()&+\\/-]/u

但是,这对 £ 或 € 字符有效,不会返回任何内容,但我需要接受这些字符,我已尝试转义它们但不起作用。

我还想创建一个类似于 A-Za-z 但允许重音字符的正则表达式,我该怎么做?

【问题讨论】:

  • 你能分享你的输入字符串和预期输出吗?

标签: php regex


【解决方案1】:

来自http://php.net/manual/en/reference.pcre.pattern.modifiers.php

u (PCRE_UTF8) 此修饰符开启 PCRE 的附加功能 这与 Perl 不兼容。模式和主题字符串是 视为 UTF-8。无效的主题将导致 preg_* 函数 什么都不匹配;无效的模式将触发级别错误 E_WARNING。五个和六个八位字节的 UTF-8 序列被视为无效 自 PHP 5.3.4 (resp. PCRE 7.3 2007-08-28) 起;以前那些是 视为有效的 UTF-8。

这意味着首先您必须确保输入字符串是正确的 UTF-8 文本。

其次,你听说过 unicode 类别吗?如果没有,请前往 http://www.regular-expressions.info/unicode.html 并搜索 Unicode 类别。例如,您可以使用\p{S} 匹配所有货币符号,或使用\p{L} 匹配所有字母。您的正则表达式可以(可能)编写如下:/[^\p{L}\p{P}\p{N}\p{S}\p{M}]/

这将几乎不匹配任何内容,因为它允许使用几乎所有字符 - 正则表达式字符类开头的^[] 之间的东西)表示“所有不是此类中的内容将被匹配”。

最重要的是,您的正则表达式只会匹配长度为恰好一个的输入 - 如果您想匹配所有内容,您应该在关闭 ] 后开始添加 +保持匹配字符直到模式失败。

那么,为了这个目的,你到底想达到什么目的?如果我们知道您想要做什么,也许我们可以建议您进行更多正则表达式改进。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多