如果你想真正瞭解一個字符串是否是一個真正的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和PHP的二進制安全轉換,則需要採取這種方法。
不是每個人都可能想的是,它可能是處理用戶輸入的情況下。 filter_var是不是也太糟糕,將在大多數情況下,人們新的PHP相當安全。
長度檢查,ctype_digit,然後檢查轉換值,它在一個範圍內對於用戶輸入也是相當穩固的。更復雜的方案可能需要修剪或正則表達式。
在這方面很多答案的問題是,雖然問題是模糊的,答案不應該是。如果你要提出一個解決方案,你應該能夠解釋到底是什麼會和不會的期望。沒有這些,就不知道答案是否符合問題或是否安全。 PHP手冊並不總是有幫助,因爲它沒有解釋它提供的每種相關方法的所有注意事項。諸如ctype_digit和is_int之類的東西非常可靠且易於預測,但is_numeric,filter_var和juggling(+ $ var)或casting(intval/floatval)的細節記錄很差。
這是你的PHP軟糖。它有大量的模式將字符串解釋爲整數,但不一致。驗證整數字符串的最嚴格的方法不直接暴露給用戶。
「2.0」應該如何處理? – nickf 2010-01-06 10:35:53