如果你想真正知道一个字符串是否是真正 PHP 整数类型的有效表示......
in_array($string, array_map('strval', range(PHP_INT_MIN, PHP_INT_MAX)), true)
但是,由于集合太大,这是不可能运行的(在这种情况下将不适合内存,如果您进行循环,则会占用太多 CPU 周期)。
您也许可以使用字符串比较进行二分搜索,但还有更好的方法。
最简单的是:
strlen($string) <= max(strlen((string)PHP_INT_MIN), strlen((string)PHP_INT_MAX)) && $string === (string)(int)$string
还有一些其他不寻常的方法来处理它,例如:
is_int(array_keys([$string => null])[0])
你也可以做字符串比较,但你仍然需要做 ctype_digit 之类的事情,检查长度是否合理(在做 ctype_digit 之类的事情之前不要浪费 CPU),并且对负数有一些尴尬的处理。
请注意,filter_var 没有正确断言字符串是真正的 PHP 整数表示。它将允许前导 + 和周围的空格。
PHP 在内部使用函数“_zend_handle_numeric_str”进行严格比较,但它不会直接在任何地方公开它,因此使用数组键的技巧(它确实使用它将表示 PHP 整数的任何字符串转换为 PHP整数)。
如果您想要与 PHP 进行二进制安全转换,这是可以采用的方法。
不是每个人都可能想要这样,这可能是处理用户输入的情况。 filter_var 还不错,而且在大多数情况下对于 PHP 新手来说是相当安全的。
长度检查、ctype_digit 以及转换后的值是否在一个范围内的检查对于用户输入来说也是相当可靠的。更复杂的方案可能需要修剪或正则表达式。
在这方面,很多答案的问题在于,虽然问题含糊不清,但答案不应该如此。如果你要提出一个解决方案,你应该能够准确地解释它会和不会期望什么。没有它,就无法判断答案是否与问题匹配或是否安全。 PHP 手册并不总是有帮助,因为它没有解释它提供的每个相关方法的所有注意事项。诸如 ctype_digit 和 is_int 之类的东西非常可靠且易于预测,但 is_numeric、filter_var 和杂耍 (+$var) 或强制转换 (intval/floatval) 的细节记录很少。
这是给你的 PHP 软糖。它有无数用于将字符串解释为整数的模式,但存在不一致的情况。验证整数字符串的最严格方法不会直接暴露给用户。