【问题标题】:PHP filter_var bug?PHP filter_var 错误?
【发布时间】:2012-11-24 21:45:15
【问题描述】:

以下代码成功验证字符串“0123.250”为有效浮点数,但实际上并非如此。这是 PHP 错误还是我做错了什么?

filter_var('0123.250', FILTER_VALIDATE_FLOAT);

【问题讨论】:

  • floatval 也将其解析为浮点数,123.25。您是否期望前导零无效?
  • 为什么这是一个无效的浮点数?
  • 在我看来就像一个浮动...
  • 前导0不会失效吗?

标签: php validation filter-var


【解决方案1】:

来自PHP documentation on float literals

LNUM          [0-9]+
DNUM          ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
EXPONENT_DNUM [+-]?(({LNUM} | {DNUM}) [eE][+-]? {LNUM})

如您所见,前导零没有限制,如以下位所示:[0-9]*[\.][0-9]+

由于页面从未提及八进制,我们需要假设前导零对解释没有影响。

假设完全相同的规则适用于FILTER_VALIDATE_FLOAT

【讨论】:

  • 我认为 OP 指的是字符串 '0123.250' 不是浮点数的事实。我跑了 var_dump(is_float('0123.250'));并且返回值为 bool(false)。但是,当我运行 var_dump(is_float(0123.250)); 时,返回的是 bool(true)。
  • @Ali is_float 检查变量的类型。 '0123.250' 不是浮点数,就像'hello kitty' 不是浮点数一样。从评论中,您可以看到 OP 担心前导零。
  • 但我希望filter_var('0123.250', FILTER_VALIDATE_FLOAT); 是假的,就像filter_var('hello_kitty', FILTER_VALIDATE_FLOAT); 是假的一样。基本上为什么php会假设"0123.250"是一个数字而不是一个字符串?
  • @Ali 这个想法是,你可以检查 user input 看看它是否有一些有效的形式。用户输入总是作为字符串提供,这就是解析字符串并查看其是否有效的原因。
【解决方案2】:

前导的 0 只是明确表明千位值为零的事实,这通常是由于该位值没有数字而暗示的。

如果您担心前导零是一个不重要的数字这一事实,我认为 PHP 不会严格遵循该定义。

【讨论】:

    猜你喜欢
    • 2011-01-09
    • 2022-10-13
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多