检查字符串是否包含整数

Ema*_*sev 35 php validation

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

以下是我希望它的工作方式:

holds_int("23") // should return true.  
holds_int("2.3") // should return false.  
holds_int("qwe") // should return false.
Run Code Online (Sandbox Code Playgroud)

Jho*_*ong 64

if((string)(int)$var == $var) {
    echo 'var is an integer or a string representation of an integer';
}
Run Code Online (Sandbox Code Playgroud)

示例结果:

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
Run Code Online (Sandbox Code Playgroud)

请参阅下面的戈登的答案,了解如果===用于比较而不是用于表示这种行为会有何不同==.

  • 我宁愿做一些类似`(string)(int)$ var ===(string)$ var`的东西,以消除我在列表中看到的误报,`1.0`. (12认同)
  • 如果$ var实际上是一个整数,则===将无效.==将,无论是字符串还是int.OP没有特别要求,但如果它实际上是一个整数,那么返回false似乎有点不合适. (6认同)
  • 这应该用`===`进行测试,并确保数字在整数范围内 (3认同)

Ja͢*_*͢ck 12

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

function test($s)
{
    return filter_var($s, FILTER_VALIDATE_INT) !== false;
}
Run Code Online (Sandbox Code Playgroud)

以下是基于Jhong 答案的结果,差异标记为!!:

var_dump(test(1)            ); // true
var_dump(test('1')          ); // true
var_dump(test('1.0')        ); // false !!
var_dump(test('1.1')        ); // false
var_dump(test('0xFF')       ); // false
var_dump(test('0123')       ); // false !!
var_dump(test('01090')      ); // false !!
var_dump(test('-1000000')   ); // true
var_dump(test('+1000000')   ); // true
var_dump(test('2147483648') ); // true !! on 64bit
var_dump(test('-2147483649')); // true !! on 64bit
Run Code Online (Sandbox Code Playgroud)

允许八进制整数:

function test($s)
{
   return filter_var($s, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_OCTAL) !== false;
}
Run Code Online (Sandbox Code Playgroud)

结果:

var_dump(test('0123') ); // true
var_dump(test('01090')); // false !!
Run Code Online (Sandbox Code Playgroud)

要允许十六进制表示法:

function test($s)
{
   return filter_var($s, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX) !== false;
}
Run Code Online (Sandbox Code Playgroud)

结果:

var_dump(test('0xFF')); // true !!
Run Code Online (Sandbox Code Playgroud)


Gor*_*don 11

不想意外地将Jhong的答案变成CW,所以这里的记录是测试时的结果===而不是==.

function test($var) {
    return ((string)(int)$var === $var);
}

var_dump( test(1)             ); // returns false vs TRUE
var_dump( test('1')           ); // returns TRUE
var_dump( test('1.0')         ); // returns false vs TRUE
var_dump( test('1.1')         ); // returns false 
var_dump( test('0xFF')        ); // returns false
var_dump( test('0123')        ); // returns false vs TRUE
var_dump( test('-0123')       ); // returns false vs TRUE
var_dump( test('-1000000')    ); // returns TRUE
var_dump( test('+1000000')    ); // returns false vs TRUE
var_dump( test('2147483648')  ); // returns false
var_dump( test('-2147483649') ); // returns false
Run Code Online (Sandbox Code Playgroud)


Dar*_*ght 8

更新自PHP 7.1起,使用is_int()非数字值时出现问题,如本SO答案中所述.在任何情况下,这是一个非常古老的答案,我真的认为它在这一点上是一个黑客,所以YMMV;)

很抱歉,如果这个问题已得到解答,但过去这对我有用:

首先检查字符串is_numeric.如果它是一个0值,以使PHP将字符串转换为其相关类型.然后你可以检查它是否是一个int is_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 />';
}
Run Code Online (Sandbox Code Playgroud)

结果:

1: true
2: true
2.5: false
foo: false
0xFF: true
204: true
420: true
0777: true
Run Code Online (Sandbox Code Playgroud)

唯一的问题是,它将逐字地评估包裹在字符串中的八进制值,即:'0123'将简单地变为123.但这很容易解决:)


Yer*_*rke 6

ctype_digit会成功的:

ctype_digit($str)

  1. $str必须是一个字符串
  2. 不允许有多余的空格
  3. 没有小数点.