【问题标题】:Check if a variable is a natural number检查变量是否为自然数
【发布时间】:2011-07-03 14:09:00
【问题描述】:

我想在网站上制作出价系统。这意味着用户可以发布他们的出价(自然数)。我想确保用户不会尝试发布字符、十进制数字等。 我不想使用 is_numeric 函数,因为允许使用十六进制表示法。 我正在考虑为此使用 preg_match 。但是在 php.net 中这个函数的文档很少,我不知道如何使用 preg_match。

那么我应该如何使用 preg_match 检查变量是否为自然数?

【问题讨论】:

  • php.net上正则表达式匹配的核心信息不是直接在preg_match函数页面上;按照该页面左侧显示的 PCRE 链接。 IE。阅读php.net/manual/en/book.pcre.php 页面。

标签: php numbers


【解决方案1】:

如果您不需要小数点:ctype_digitfilter_var($var, FILTER_VALIDATE_INT)
如果你这样做:filter_var($var, FILTER_VALIDATE_FLOAT)

【讨论】:

  • 当然,我只是指出,在这种特殊情况下,小数点不是问题的一部分......
  • @deceze filter_var 没问题。你只需要为min_range添加一个选项
【解决方案2】:

ctype_digit 做你想做的事:

检查提供的字符串文本中的所有字符是否都是数字。

(在 PHP 5.1.0 之前,当文本为空字符串时,此函数返回 TRUE。)

【讨论】:

  • ctype_digit(123); // 返回 false,因为它期望输入是字符串。
【解决方案3】:

preg_match('/^[0-9]+$/', $var);ctype_digit

【讨论】:

  • preg_match('/^[0-9]+$/', $var) 和 ctype_digit($var) 有区别吗?
  • read php.net/ctype_digit - ctype_digit 仅适用于字符串,不适用于整数。听起来很奇怪,但如果您的日期来自 $_GET 或 $_POST,它将按预期工作。
  • 仔细阅读/^[0-9]+$/接受0。我建议您改用/^[1-9][0-9]*$/
【解决方案4】:

我通常会告诫不要使用正则表达式来解析数字,因为通常有比正则表达式更好的解决方案,但既然你在问,我会尽力为你提供一些帮助:

preg_match 使用正则表达式 (regex) 进行匹配。

您可以在 http://www.regular-expressions.info/ 等网站上找到更多关于正则表达式语法的信息

如果要匹配正则表达式中的数字,可以使用[0-9]\d

如果你想匹配任何一个或多个,你会使用加号。

最后,正则表达式字符串需要包含在一对字符中。选择的字符通常是斜杠 (/) 字符,因为某些语言特别需要此字符,但 PHP 也允许使用其他字符;波浪号 (~) 很常见。

因此,匹配任意位数的正则表达式字符串将是"/\d+/"。然后可以将其放入preg_match 调用中,如下所示:

$isnumeric = preg_match("/\d+/",$input_string);

如果您有更具体的要求,可以通过将加号替换为 {max}{min,max} 来限制允许的字符数,其中“min”和“max”是允许前面匹配的次数。因此,要允许长度介于 2 到 6 位之间的数字,您可以这样使用:

$isnumeric = preg_match("/\d{2,6}/",$input_string);

如果您需要允许小数点,您需要知道点字符是正则表达式中的特殊字符(这意味着“匹配任何字符”),因此您需要使用反斜杠对其进行转义。

因此,匹配货币金额的正则表达式有两个小数位,并且该点前至少有一位数字将是这样的:

$isnumeric = preg_match("/\d+\.\d\d/",$input_string);

最后,请注意,如果字符串只是包含匹配的值,则正则表达式将在上述所有情况下返回true。为确保它不包含任何其他内容,您需要使用锚字符将其“锚定”到字符串的开头和结尾:^ 用于字符串的开头,$ 用于结尾。

所以对于前面的例子,如果你希望它包含一个十进制数,没有别的,你需要这个:

$isnumeric = preg_match("/^\d+\.\d\d$/",$input_string);

正则表达式是一个复杂的主题,但我希望它能给你一个开始。

【讨论】:

【解决方案5】:

我知道这已经很老了,但我想分享下一个解决方案,以防其他人遇到这个问题。

我假设自然数是指正整数(不包括数字 0)。

function is_positive_integer( $value ) {

    // Check if is integer and greater than zero
    if( is_int( $value ) && $value > 0 ) {
        return true;
    }

    // Is not a positive integer
    else {
        return false;
    }
}

【讨论】:

    【解决方案6】:

    这种类型取决于你对自然数的定义——根据不同的理论,数字零 (0) 算不算自然数。

    要回答您关于如何使用preg_match 解决此问题的问题:

    如果你想包含零,使用 preg_match 非常简单preg_match('^[0-9]+$', $input)
    用法:

    if (preg_match('^[0-9]+$', $input))
      // $input represents a non-negative numeric value
    else
      // $input does not represent a non-negative numeric value
    

    如果您不想包含零,请使用preg_match('^[1-9][0-9]*$', $input)

    if (preg_match('^[1-9][0-9]*$', $input))
      // $input represents a positive numeric value
    else
      // $input does not represent a positive numeric value
    

    也就是说 - 对于您的特定问题,使用 ctype_digit 是一种更快的解决方案,正如其他人已经指出的那样(如果您不想允许数字零,则必须进行第二次检查)。

    【讨论】:

      【解决方案7】:
      in_array(str_replace(str_split('0123456789'), '', $s), array(',','.',''));
      

      【讨论】:

        【解决方案8】:

        简单的功能:

        function isnature($x){
        $y = ceil($x)-floor($x);
        return $y == 0 ? true : false;
        }
        

        【讨论】:

          【解决方案9】:

          从数学的角度来看,自然数是一个正整数,包括零,所以你可以这样检查:

          is_int($bid) && $bid >= 0

          【讨论】:

            【解决方案10】:

            简单快捷

                            if( is_numeric( $key ) &&  intval( $key ) == $key )
                             {
                                  //key == number
                             }
            

            【讨论】:

              猜你喜欢
              • 2011-02-26
              • 1970-01-01
              • 1970-01-01
              • 2013-10-14
              • 2011-01-12
              • 2014-01-25
              • 1970-01-01
              • 1970-01-01
              • 2012-02-05
              相关资源
              最近更新 更多