PHP has a variety of functions and approaches to determine if a variable is a number and/or an integer. The problem is that many of the straight forward approaches can result in false positives depending on how they react to type juggling. Case in point,
is_int() will return
false for the string “123”, we could use
is_numeric() but that will return
true for both “123” and the decimal number 1.23, and both functions will return
true if you cast a string as an integer like this:
In the scenario where you want to determine if a variable is a string (regardless if it’s a string or a number to begin with) you can simply use
preg_match() to determine if the string contains just numbers:
preg_match('/^[0-9]+$/', trim($variable)); preg_match('/^\d+$/', trim($variable));
Note that we trim the variable in the scenario when it’s provided from user input, you can read more about it here](/how-to-strip-whitespace-from-a-string/).
There is another function that you could use but it is only meant to work on strings and returns
false if the variable is an actual integer. That function is
ctype_digit() and you can trick it by casting
(string) when you call it:
$variable in question is known to always be a string (like in the case of user input and often times data being returned from a database) you can simply omit the cast, better safe than sorry though!