簡體   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