2012-11-08 94 views
1

這是我在Kohana3驗證規則已經找到:UTF-8,數字和正則表達式

public static function digit($str, $utf8 = FALSE) 
{ 
    if ($utf8 === TRUE) 
    { 
     return (bool) preg_match('/^\pN++$/uD', $str); 
    } 
    else 
    { 
     return (is_int($str) AND $str >= 0) OR ctype_digit($str); 
    } 
} 

能有人給路過$utf8參數時爲truefalse可以給出不同的結果(一個例子準確 - 誤報爲$utf8 == false)?

從我記得 - 數字是ascii-safe字符和utf-8字符都不會與他們混淆。

PS:更詳細的 - 這可能愚弄這張支票,並通過一些在UTF-8將看都不像是一個數字,而是會通過檢查與$utf-8 == false

+0

@mario:對於無效的UTF-8很明顯,但我對有效的UTF-8很好奇。就像着名的帶有引號和多字節字符集的sql轉義「漏洞」一樣,但數字爲 – zerkms

+0

剛剛經過測試,PCRE無論如何都拒絕無效的UTF-8編碼。 – mario

回答

2

剛剛給你的第二個問題部分多一點酒精,我的結論是,你不能隱藏一個UTF-8序列的ASCII數字。數字必須是0x30 .. 0x39或位數00110000 .. 00110110 .. 00111001

UTF-8編碼包括前綴,如

11110xxx 10xxxxxx 10xxxxxx 

並因此數位ASCII表示不能在任何地方匹配:

00110000 
▲▲  00110000 ▼ 
      ▲   00110000 

所以這是不可能的,這將匹配的Latin-1/ASCII模式,但在/u模式下也有\pN。當然忽略無效的編碼。

3

即使0-9是ASCII安全的,Unicode中有很多其他的數字。

查看Unicode Characters in the 'Number, Decimal Digit' Category 的列表。一些例子是U + 0660 ARABIC-INDIC DIGIT ZERO(0)和U + 1D7EC MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO()。

+0

這些是假陰性的例子。感謝那。但是有任何誤報? (當'$ utf-8 == true'會給出false並且'$ utf-8 == false'會給出正確的結果] – zerkms

1
+0

有關問題中的'PS'的任何想法? – zerkms

+0

@zerkms - 如果沒有unicode正則表達式修飾符'/ u',則不能使用'\ pN',因爲這是一個僅在unicode擴展中有效的標識符。在unicode正則表達式中,\ pN'匹配所有'\ d'和所有其他非ascii數字字符。在非Unicode的正則表達式中,當所有非ASCII字符不匹配時,您可以使用'\ d'作爲數字。 –

+0

我沒有提到有關刪除「u」修飾符的任何信息,我問過是否有可能編寫一個有效的UTF-8字符串,看起來不是一組數字,但會用'$ utf8'參數'== false'成功驗證。 – zerkms

相關問題