我使用以下正则表达式和preg_replace来过滤输入:
/[^A-Za-z0-9[:space:][:blank:]_<>=@#£€$!?:;%,.\\'\\\"()&+\\/-]/
但是这不允许像变音符号这样的重音字符,所以我把它改成了:
/[^\w[:space:][:blank:]_<>=@#$£€!?:;%,.\\'\\\"()&+\\/-]/u
然而,这确实与£或€字符一起使用,没有返回任何内容,但我需要接受这些字符,我试图逃避它们但是这不起作用。
另外我想创建一个类似于A-Za-z的正则表达式,但是会允许重音字符,我该怎么做?
答案 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}}保持匹配的字符,直到模式失败。
所以,为此,你究竟想要实现什么目标?如果我们知道您正在尝试做什么,也许我们可以建议您进行更多的正则表达式改进。