1

这是我在 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 安全字符,任何 utf-8 字符都不会与它们混淆。

PS:更详细 - 是否有可能欺骗这个检查并通过一些在 UTF-8 中看起来不像数字的东西,但会通过检查$utf-8 == false

4

3 回答 3

3

尽管 0-9 是 ASCII 安全的,但 Unicode 中还有很多其他数字。

有关列表,请参阅“数字、十进制数字”类别 中的 Unicode 字符。一些例子是 U+0660 ARABIC-INDIC DIGIT ZERO (٠) 和 U+1D7EC MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO ()。

于 2012-11-08T22:42:22.673 回答
2

只是给了你的第二个问题部分更多的酒精,我的结论是你不能在 UTF-8 序列中隐藏一个 ASCII 数字。数字必须是0x30..0x39或在位范围内00110000.. 00110110.. 00111001.

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

 11110xxx  10xxxxxx  10xxxxxx

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

 00110000 
 ▲▲        00110000  ▼
           ▲         00110000

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

于 2012-11-08T23:22:39.463 回答
1
  1. 爱琴海数字,

  2. 古希腊数字

...ETC。

于 2012-11-08T22:53:38.023 回答