繁体   English   中英

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

[英]regex \p{L} problems

即时通讯使用此为我的验证:

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

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

// ps(如果我使用\\ p {L}ü,则出现如下错误):

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

问题在于连字符的位置。在字符类中,您可以将连字符作为范围中的第一个或最后一个字符。 如果将连字符放在其他任何地方,则需要对其进行转义以将其添加到班级中。

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

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

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

逃脱破折号:

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

还添加/u修饰符以进行unicode匹配:

$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

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

包括上面的修复程序, "\\-_.:!='\\/&*%+,()"还有另一个问题。 您是否要包含\\/ 还是只有其中之一?

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

如果您不想转义/ ,则可以将$default的构造中的分隔符/替换为正则表达式中未使用的内容,例如~ 在这种情况下,特殊字符列表将少一个\\"\\-_.:!='\\\\\\\\/&*%+,()"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM