如何检查PHP变量是否包含非数字?

时间:2011-06-09 08:55:16

标签: php string forms variables

我只是想知道检查PHP变量的任何非数字的方法,以及它是否还检测字符之间的空格?需要确保没有任何奇怪的东西被放入我的表单字段。提前谢谢。

10 个答案:

答案 0 :(得分:15)

如果您的意思是只想要一个值来包含数字,那么您可以使用ctype_digit()

答案 1 :(得分:15)

您可以使用is_numeric()

if ( is_numeric($_POST['foo']) ) {
    $foo = $_POST['foo'];
} else {
    // Error
}

这将检查该值是否为数字,因此它可能包含除数字之外的其他内容:

12
-12
12.1

但这将确保该值为有效数字

答案 2 :(得分:14)

您可以使用ctype_digit

例如:

if (!ctype_digit($myString)) {
    echo "Contains non-numbers.";
}

答案 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秒完成此测试!