UTF-8,数字和正则表达式

时间:2012-11-08 22:39:53

标签: php regex utf-8 kohana kohana-3

这是我在Kohana3验证器规则中发现的:

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参数作为true传递时给出一个示例,而false可以给出不同的结果(准确地说是$utf8 == false的误报)?

根据我的记忆 - 数字是ascii-safe字符,utf-8字符都不会与它们混淆。

PS :更详细 - 是否有可能欺骗此检查并传递UTF-8看起来不像数字的内容,但会通过$utf-8 == false < / p>

3 个答案:

答案 0 :(得分: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()。

答案 1 :(得分:2)

刚刚给你的第二个问题提供了更多的酒精,我的结论是你无法隐藏UTF-8序列中的ASCII数字。数字必须为0x30 .. 0x39或位数00110000 .. 00110110 .. 00111001

UTF-8编码包括前缀,例如

 11110xxx  10xxxxxx  10xxxxxx

因此数字ASCII表示无法在任何地方匹配:

 00110000 
 ▲▲        00110000  ▼
           ▲         00110000

因此,它不可能在Latin-1 / ASCII模式下匹配,但在\pN模式下也满足/u。当然忽略无效的编码。

答案 2 :(得分:1)