Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 检查字符串是否包含整数_Php_Validation - Fatal编程技术网

Php 检查字符串是否包含整数

Php 检查字符串是否包含整数,php,validation,Php,Validation,你知道有一个函数可以检查字符串是否包含整数吗 以下是我期望它如何工作: holds_int("23") // should return true. holds_int("2.3") // should return false. holds_int("qwe") // should return false. 示例结果: var_dump( test(1) ); // TRUE var_dump( test('1') ); // TRUE

你知道有一个函数可以检查字符串是否包含整数吗

以下是我期望它如何工作:

holds_int("23") // should return true.  
holds_int("2.3") // should return false.  
holds_int("qwe") // should return false.
示例结果:

var_dump( test(1)             ); // TRUE
var_dump( test('1')           ); // TRUE
var_dump( test('1.0')         ); // TRUE
var_dump( test('1.1')         ); // false
var_dump( test('0xFF')        ); // false
var_dump( test('0123')        ); // TRUE
var_dump( test('01090')       ); // TRUE
var_dump( test('-1000000')    ); // TRUE
var_dump( test('+1000000')    ); // TRUE
var_dump( test('2147483648')  ); // false
var_dump( test('-2147483649') ); // false
如果将===用于比较而不是==,这将如何表现不同,请参见下面Gordon的答案。

其他选项

function holds_int($str)
   {
   return preg_match("/^-?[0-9]+$/", $str);
   }

可能有两种情况-

您需要检查一个数字的确切字符串格式大多数ans都是关于这个的

您要检查字符串是否包含特定的数字

preg_match'/'.$matching_number'/',$container_string


我不想不小心把Jhong的答案变成CW,所以这里是用===而不是==测试的结果

comparison.php:

<?php
function is_numeric_int($s)
{
  return (strval(intval($s)) === $s);
}

function print_ini($s)
{
  echo "$s: " . ( is_numeric_int($s) ? 'true' : 'false' ) . "\n";
}

print_ini('qwe');
print_ini('23');
print_ini('-23');
print_ini('23.0');
print_ini('-23.0');
?>
is_int是完成这项工作的唯一方法

自PHP7.1更新以来,将is_int与非数值一起使用存在问题,如本文所述。在任何情况下,这是一个非常古老的答案,我真的认为这是一个黑客在这一点上,所以YMMV

很抱歉,如果这个问题已经得到回答,但这在过去对我有效:

首先检查字符串是否为数字。如果是,则向该值添加一个0,以使PHP将字符串转换为其相关类型。然后你可以检查它是否是一个带有is_int的int。又快又脏,但它对我有用

$values = array(1, '2', '2.5', 'foo', '0xFF', 0xCC, 0644, '0777');

foreach ($values as $value) {
  $result = is_numeric($value) && is_int(($value + 0)) ? 'true' : 'false';
  echo $value . ': ' . $result . '<br />';
}

唯一的问题是,它将按字面意思计算包装在字符串中的八进制值,即:“0123”将变为123。但这很容易解决:

不是最快的方法,但非常准确:

function test($s)
{
    return filter_var($s, FILTER_VALIDATE_INT) !== false;
}
以下是基于Jhong的结果,差异用!!:

要允许八进制整数,请执行以下操作:

function test($s)
{
   return filter_var($s, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_OCTAL) !== false;
}
结果:

1: true
2: true
2.5: false
foo: false
0xFF: true
204: true
420: true
0777: true
var_dump(test('0123') ); // true
var_dump(test('01090')); // false !!
var_dump(test('0xFF')); // true !!
要允许十六进制表示法,请执行以下操作:

function test($s)
{
   return filter_var($s, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX) !== false;
}
结果:

1: true
2: true
2.5: false
foo: false
0xFF: true
204: true
420: true
0777: true
var_dump(test('0123') ); // true
var_dump(test('01090')); // false !!
var_dump(test('0xFF')); // true !!

如果字符串包含空格,则@Jack的答案将无法提供准确的结果。 e、 g

根据上述检查,上述字符串将不是int

因此,不要使用此选项,请尝试以下操作:

if(ctype_digit(trim('19  '))){
    echo 'it is digit ';
}else{
    echo 'it is not digit ';
}

也许这在特定情况下也会有所帮助 php中有一个函数已经做到了这一点,它的名字是_numeric 它将相应地返回真或假

   if(is_numeric($somestring) == True){
        echo "this string contains a integar";
    }
链接:


你说过holdsint2应该返回true,is_numeric2返回true,is_numerica返回False,正如预期的那样,这个函数存在于php中,无需重写。

我喜欢nyson的建议,但注意到它对于'0123'将是False。 我现在这样做:

(string)(int)$var === ltrim((string)$var, '0')
这本可以作为评论@nyson发布的,但我还没有足够的特权这么做

编辑以添加: 如果你想让零为真,你需要做如下的事情

(int)$var === 0 || (string)(int)$var === ltrim((string)$var, '0')
ctype_数字将实现以下功能:

ctype_数字$str

$str必须是字符串 不允许有额外的空间 没有小数点。
如果在项目中使用Assert library,只需一行即可轻松完成:

Assertion::integerish($var);

注意:如果违反断言,它会抛出一个异常。

我很久以来一直在使用它。虽然所有其他答案都有缺点或特殊情况,但如果您想检测任何可能的int值对象,包括1.0 1.0 1e3 007,那么最好让is_numeric来检测任何可能表示数字的PHP对象,然后才检查该数字是否真的是int,将其转换为int并返回到float,并测试其是否改变了值:

function isIntValued($var) {
    if(is_numeric($var)) { // At least it's number, can be converted to float
        $var=(float)$var; // Now it is a float
        return ((float)(int)$var)===$var;
    }
    return FALSE;
}
或者简言之

function isIntValued($var) {
    return (!is_numeric($var)?FALSE:((float)(int)(float)$var)===(float)$var);
}

请注意,虽然PHP的is_int检查变量的类型是否为整数,但另一个标准PHP函数is_numeric非常准确地确定变量的内容(即字符串字符)是否可以表示数字

相反,如果您希望1.0和2.00不被视为整数,而是浮动,即使它们有整数值,那么@Darragh Enright using的另一个答案是数值,加零并测试int可能是最正确的解决方案:

    is_numeric($s) && is_int($s+0)

目前的形式也不能解释负整数。对于一个表面上很简单的问题,正则表达式是一个资源密集型的解决方案,我没有投你反对票。现在你的正则表达式允许12-34。您应该使用/^-?[0-9]+$/。如果你想拒绝前导零,你应该使用/^?[1-9] [09] *$/。关于中间减号的好点,更新代码!NB:我不是因为否决票本身而抱怨,只是问为什么它不正确。至于regexp是资源密集型的,这实际上取决于调用它的频率,正则表达式:现在你有两个相关的问题-测试基本上是最好的same@mathk我需要验证用户输入。什么输入被认为是有效的?你考虑“1”,“0xFF”或“0123”八进制作为测试的整数,如果传入的是整数而不是字符串,该怎么办?@Gumbo:在我正在处理的情况下,任何自然数都将被视为有效输入。这应该使用===进行测试,并确保该数字在整数范围内===如果$var实际上是整数,则不会起作用。==威尔,不管它是一个字符串还是一个整数。OP没有要求这样做
具体来说,如果它实际上是一个整数,则返回false似乎有点反常。@戈登:转换为整数将始终产生一个有效的整数。我宁愿做一些类似于stringint$var==string$var的事情,以消除我在列表1.0中看到的假阳性。@nyson,你应该给我一个答案,这样我就可以投赞成票了。1.0 float和0123 invalid在这里比我的版本更好——我没有考虑过它们@Jhong using==对于十六进制0xFF和科学符号-1.3e3也将返回true,例如,当不用作字符串时,两者都返回true,如果用作字符串则返回false这是不正确的;是的,但是像这里的大多数事情一样,在发帖的时候,原始问题是正确的,没有提到浮动,然后原始海报去编辑他的问题,所以现在我看起来像个白痴。很典型。事实上,我的回答对19岁的人来说是正确的;你一定会对Jhong的答案感到困惑。is_int确定变量的类型是否是整数,而不是值。当值实际上不是数字时,例如foo,我得到以下PHP错误:遇到非数字值。我正在使用PHP7.1.3。感谢您对@Pathros的评论——正如您所看到的,这是一个7年前的答案,所以看起来自PHP7.1以来,行为发生了变化。我将编辑我的答案以记录更改。我刚刚使用了你的函数,但它有大数字的问题。鉴于要求检查字符串是否包含整数,但没有说明它可以有多长,我认为正则表达式方法在这种情况下可能更好。对于像999999999999999999这样的数字,它可以工作,但如果您尝试使用一个包含数字999999999999999999的字符串(这是一个有效的整数),它将失败。@JeanPaulRuiz当然,这是一种解释方式,我的方法检查它是否可以分配给变量:除0123是一个变量外int@FrancescoMM哎哟对
function isIntValued($var) {
    return (!is_numeric($var)?FALSE:((float)(int)(float)$var)===(float)$var);
}
 function isIntValued($var) {
    return (is_numeric($var) && ((float)(int)(float)$var)===(float)$var);
}
    is_numeric($s) && is_int($s+0)