我只是想知道检查PHP变量的任何非数字的方法,以及它是否还检测字符之间的空格?需要确保没有任何奇怪的东西被放入我的表单字段。提前谢谢。
答案 0 :(得分:15)
如果您的意思是只想要一个值来包含数字,那么您可以使用ctype_digit()
。
答案 1 :(得分:15)
您可以使用is_numeric()
:
if ( is_numeric($_POST['foo']) ) {
$foo = $_POST['foo'];
} else {
// Error
}
这将检查该值是否为数字,因此它可能包含除数字之外的其他内容:
12
-12
12.1
但这将确保该值为有效数字。
答案 2 :(得分:14)
答案 3 :(得分:8)
如果字符串中有非数字,则返回true
。它可以检测字母,空格,制表符,新行,不管数字是什么。
preg_match('#[^0-9]#',$variable)
答案 4 :(得分:2)
这将检查输入值是否为数字。希望这有帮助
if(!preg_match('#[^0-9]#',$value))
{
echo "Value is numeric";
}
else
{
echo "Value not numeric";
}
答案 5 :(得分:1)
PHP的函数is_numeric()可能就是你要找的东西。
答案 6 :(得分:1)
投射和比较:
function string_contain_number($val)
{
return ($val + 0 == $val) ? true : false;
}
答案 7 :(得分:1)
<% String c,a;
String[] CA =(String[])session.getAttribute("CA");
String[] AS =(String[])session.getAttribute("AS");
List<quest> l=(List<quest>)session.getAttribute("myquestion");
quest[] question = new quest[l.size()];
l.toArray(question);
%>
<table border=1>
<tr>
<th colspan="2" width="500">Questions</th>
<th>CorrectAnswer</th>
<th>Answer sheet</th>
</tr>
<%
for(pos=0;pos<question.length;pos++){
String ques=question[pos].ques;
String opa=question[pos].opa;
String opb=question[pos].opb;
String opc=question[pos].opc;
String opd=question[pos].opd;
c=CA[pos];
a=AS[pos];
%>
<tr><!-- moved tr inside for loop-->
<td>Question <%=pos+1%></td>
<td width="500"><%= ques %></td>
<td><%=c %></td>
<td><%= a%></td><!-- added missing /td-->
</tr>
<%} %>
</table><!-- moved /table outside of for loop-->
</body>
答案 8 :(得分:1)
对于我的测试用例,这比 preg_match
快约 30%,同时仍然让您匹配您想要的任何字符:
if( $a !== '' && trim($a, ' 1234567890.,') === '' ){
print("The variable contains only digits, decimal separators and spaces");
}
这只是删除字符串中提供的所有字符。如果结果是一个空字符串,你就知道它只包含那些字符。
答案 9 :(得分:0)
假设您只需要(且仅有)有效整数,并且您不希望用户使用public static ulong SignedLongToUnsignedLong(long signedLongValue)
{
ulong backConverted = 0;
// map ulong to long [ 9223372036854775808 = abs(long.MinValue) ]
if (signedLongValue < 0)
{
// Cannot take abs from MinValue
backConverted = (ulong)System.Math.Abs(signedLongValue - 1);
backConverted = 9223372036854775808 - backConverted - 1;
}
else
{
backConverted = (ulong)signedLongValue;
backConverted += 9223372036854775808;
}
return backConverted;
}
public static long UnsignedLongToSignedLong(ulong unsignedLongValue)
{
// map ulong to long [ 9223372036854775808 = abs(long.MinValue) ]
return (long) (unsignedLongValue - 9223372036854775808);
}
public static int UnsignedIntToSignedInt(uint unsignedIntValue)
{
// map uint to int [ 2147483648 = abs(long.MinValue) ]
return (int)(unsignedIntValue - 2147483648);
}
public static uint SignedIntToUnsignedInt(int signedIntValue)
{
uint backConverted = 0;
// map ulong to long [ 2147483648 = abs(long.MinValue) ]
if (signedIntValue < 0)
{
// Cannot take abs from MinValue
backConverted = (uint)System.Math.Abs(signedIntValue - 1);
backConverted = 2147483648 - backConverted - 1;
}
else
{
backConverted = (uint)signedIntValue;
backConverted += 2147483648;
}
return backConverted;
}
public static void TestLong()
{
long min_long = -9223372036854775808;
long max_long = 9223372036854775807;
ulong min_ulong = ulong.MinValue; // 0
ulong max_ulong = ulong.MaxValue; // 18446744073709551615 = (2^64)-1
long dbValueMin = UnsignedLongToSignedLong(min_ulong);
long dbValueMax = UnsignedLongToSignedLong(max_ulong);
ulong valueFromDbMin = SignedLongToUnsignedLong(dbValueMin);
ulong valueFromDbMax = SignedLongToUnsignedLong(dbValueMax);
System.Console.WriteLine(dbValueMin);
System.Console.WriteLine(dbValueMax);
System.Console.WriteLine(valueFromDbMin);
System.Console.WriteLine(valueFromDbMax);
}
public static void TestInt()
{
int min_int = -2147483648; // int.MinValue
int max_int = 2147483647; // int.MaxValue
uint min_uint= uint.MinValue; // 0
uint max_uint = uint.MaxValue; // 4294967295 = (2^32)-1
int dbValueMin = UnsignedIntToSignedInt(min_uint);
int dbValueMax = UnsignedIntToSignedInt(max_uint);
uint valueFromDbMin = SignedIntToUnsignedInt(dbValueMin);
uint valueFromDbMax = SignedIntToUnsignedInt(dbValueMax);
System.Console.WriteLine(dbValueMin);
System.Console.WriteLine(dbValueMax);
System.Console.WriteLine(valueFromDbMin);
System.Console.WriteLine(valueFromDbMax);
}
或hexadecimal
或任何其他形式的数字来处理您的数据和数据库,那么您始终可以使用此方法:
binary
诀窍很简单。它将string类型的变量强制转换为整数类型,然后将其强制转换为字符串。 超快速,超级简单。
为了测试我准备了一个测试:
if(((string) (int) $stringVariable) === $stringVariable) {
// Thats a valid integer :p
}
else {
// you are out of luck :(
}
此方法不足的唯一地方是负数,因此您需要在此旁边检查(使用'1337' is pure integer.
'0x539' is not.
'02471' is not.
'0000343' is not.
'0b10100111001' is not.
'1337e0' is not.
'not numeric' is not.
'not numeric 23' is not.
'9.1' is not.
'+655' is not.
'-586' is pure integer.
)。
现在我认为((string) (int) $stringVariable) === $stringVariable && $stringVariable[0] !== "-"
方法是最好的。但在任何与用户打交道的项目中,速度是一个重要因素。所以我准备了一个基准测试,测试上面的测试达到了500,000次,结果令人惊讶:
我自己发明的方法只采取:
preg_match
与6.4700090885162
相比完成的秒数:
preg_match
秒完成此测试!