PHP - 正则表达式允许unicode charcaters

时间:2017-05-01 16:31:26

标签: php regex

我使用以下正则表达式和preg_replace来过滤输入:

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

但是这不允许像变音符号这样的重音字符,所以我把它改成了:

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

然而,这确实与£或€字符一起使用,没有返回任何内容,但我需要接受这些字符,我试图逃避它们但是这不起作用。

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

1 个答案:

答案 0 :(得分:2)

来自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起(分别为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}]/

这几乎没有匹配,因为它允许使用几乎所有字符 - ^在正则表达式字符类的开头([]之间的东西)意味着&#34;所有不属于本课程的内容都将匹配&#34;。

最重要的是,你的正则表达式只匹配长度正好一个的输入 - 如果你想匹配所有内容,你应该在结束后开始添加+ { {1}}保持匹配的字符,直到模式失败。

所以,为此,你究竟想要实现什么目标?如果我们知道您正在尝试做什么,也许我们可以建议您进行更多的正则表达式改进。