正则表达式\ p {L}问题

时间:2014-10-28 14:56:34

标签: php regex preg-match

我将此用于我的验证:

$space = "[:blank:]";
$number = "0-9";
$letter = "\p{L}"; 
$specialchar = "-_.:!='\/&*%+,()";
...
$default = "/^[".$space.$number.$letter.$specialchar."]*$/";
if (!preg_match($all, $input)){
                $error = true;
}

我遇到的问题是: 一切都在工作,除了“ü”......“Ü”只是“ü”不是,我不知道为什么? \ p {L}应该接受所有字母和特殊字母......我不明白为什么它不起作用:(
任何人都知道我能做什么?
我尝试验证的数据是来自注册表格的POST值

// p.s.如果我正在使用\ p {L}ü我得到这样的错误:

 Compilation failed: range out of order in character class at offset 23 in...

3 个答案:

答案 0 :(得分:2)

问题是连字符的位置。在字符类中,您可以将连字符作为范围中的第一个或最后一个字符。如果你将连字符放在任何其他地方,你需要将它转义为你的类。

$specialchar = "_.:!='\/&*%+,()-";

此外,您还需要将u(Unicode)修饰符添加到正则表达式中。此修饰符打开PCRE的其他功能,模式字符串被视为( UTF-8 ),并且模式中的变量错误。

$default = "/^[".$space.$number.$letter.$specialchar."]*$/u";

答案 1 :(得分:1)

逃离破折号:

$specialchar = "\-_.:!='\/&*%+,()";
#        here __^

还为unicode匹配添加/u修饰符:

$default = "/^[".$space.$number.$letter.$specialchar_def."]*$/u";
#                                                      here __^

<强>测试

$space = "[:blank:]";
$number = "0-9";
$letter = "\p{L}"; 
$specialchar = "\-_.:!='\/&*%+,()";
$default = "/^[".$space.$number.$letter.$specialchar."]*$/u";
//                  wrong variable name ^^^^^^^^^^^^ in your example.
$input = 'üÜ is but ';
if (!preg_match($default, $input)){
    echo "KO\n";
} else {
    echo "OK\n";
}

<强>输出:

OK

答案 2 :(得分:0)

-是字符类中的特殊字符,用于指定字符范围。通过字符串连接构造正则表达式时,建议您将其转义\-

包含上述修正,"\-_.:!='\/&*%+,()"还有另一个问题。要包含\/吗?或者只有其中一个?

如果要包含两者,则应将其指定为"\-_.:!='\\\\\/&*%+,()"

如果您不想转义/,可以将/构造中的分隔符$default替换为正则表达式中未使用的内容,例如{{1} }。在这种情况下,特殊字符列表将少一个~\