这是我在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>
答案 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)
...等