【问题标题】:Validated a Credit Card Number验证信用卡号
【发布时间】:2021-04-01 01:54:19
【问题描述】:

需要一些帮助,我已经完成了,但我无法让它显示或正常工作。使用 str_replace,假设获取实际的信用卡号并从中删除 -。我把那部分写下来了,但是当我创建一个嵌套的 if 语句并使用 is_numeric 进行验证时,它显示“这是一个无效的卡号”;当然,如果我把它写成 is_numeric($CreditNumber)) 它也会打印出信用卡号和回声。

另外,我注意到一件事。我已将此文件上传到我们的课程服务器,它显示了信用卡号,但它显示了两次,而当我使用 XAMPP 时它根本不显示它。

有什么建议吗?这是代码

  <?php 

$CreditCard = array ("", "8910-1234-5678-6543", "OOOO-9123-4567-0123");

foreach ($CreditCard as $CreditNumber) {
    if(empty($CreditNumber)) {
        echo "Invalid Card Number <br/>";
    } else {
        $CreditNumber = str_replace("-", "", $CreditCard[1]);

        echo $CreditNumber;
        echo "<br/>";
        if (is_numeric()) {
            echo "This is an invalid Card Number";
        } else {
            echo $CreditNumber; //This shows the credit card number without the dashes
        }
    }
}

?>

编辑:

我已经完成了,它最后显示了正确的数字,但出于某种奇怪的原因,它重复了两次 16 位数字

    <?php 

$CreditCard = array ("", "8910-1234-5678-6543", "OOOO-9123-4567-0123");

foreach ($CreditCard as $CreditNumber) {
    if(empty($CreditNumber)) {
        echo "Invalid Card Number <br/>";
    } else {
        $CreditNumber = str_replace("-", "", $CreditCard[1]);

        //echo $CreditNumber;
        //echo "<br/>";
        if (is_numeric($CreditCard)) {
            echo "This is an invalid Card Number";
        } else {
            echo $CreditNumber; //This shows the credit card number without the dashes
        }
    }
}

?>

【问题讨论】:

  • 仅供参考,信用卡不是数字,即使它们仅由数字组成,所以不要这样对待它们。将它们视为字符串。
  • $CreditCard[1] 应该是$CreditCard
  • if (is_numeric()) { 应该是if (is_numeric($CreditCard)) {
  • 我之所以将它作为“$CreditCard[1]”是因为它是一个数组,所以我只需要第二部分。在 'if (is_numeric($CreditCard))' 上,我输入了 '$CreditNumber' 但它现在起作用了,唯一的问题是数字重复第二次,为什么?
  • 请添加所需的输出

标签: php foreach str-replace isnumeric


【解决方案1】:

正则表达式在这里很有用:

$CreditCard = array("", "8910-1234-5678-6543", "OOOO-9123-4567-0123");

foreach ($CreditCard as $CreditNumber) {
    if (preg_match("/^\d{4}-\d{4}-\d{4}-\d{4}$/", $CreditNumber)) {
        echo "VALID:   " . $CreditNumber . "\n";
    }
    else {
        echo "INVALID: " . $CreditNumber . "\n";
    }
}

打印出来:

INVALID: 
VALID:   8910-1234-5678-6543
INVALID: OOOO-9123-4567-0123

请注意,如果您希望正则表达式模式验证特定供应商卡(例如 Amex、Mastercard、Visa 等),请使用参考,such as this one

【讨论】:

  • 信用卡的位数可能多于或少于 16 位。
  • @user1597430 但是 OP 的测试数据似乎并没有真正暗示这一点。正如我所提到的,对于一个强大的解决方案,OP 应该确定它想要迎合哪些卡,然后使用为每张卡量身定制的正则表达式。
  • 我见过几个使用这种方法的例子,但我们的教授希望我们使用 is_numric 和 str_replace。我似乎已经完成了它,尽管出于某种奇怪的原因,当它在最后回显正确的数字时,它会重复两次。
【解决方案2】:

在您的循环中,您覆盖了$CreditCard,因此您无法在之后显示原始格式。你可以使用一个简短的函数在一个作用域块中进行测试:

function isCreditNumber($creditNumber) {
    if (empty($creditNumber)) {
        return false;
    }
    $num = str_replace("-", "", $creditNumber);
    if (! is_numeric($num)) {
        return false;
    }
    return true;
}

$CreditCard = ["", "8910-1234-5678-6543", "OOOO-9123-4567-0123"];

foreach ($CreditCard as $CreditNumber) {
    if (! isCreditNumber($CreditNumber)) {
        echo "Invalid Card Number <br/>";
    }
    else {
        echo $CreditNumber . " is valid<br>";
    }
}

输出:

Invalid Card Number
8910-1234-5678-6543 is valid
Invalid Card Number

【讨论】:

    猜你喜欢
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 2012-01-01
    • 2011-11-16
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多