// This function will take a credit card number and check to make sure it // contains the right amount of digits and uses the Luhn Algorithm to // weed out made up numbers function validateCreditcard_number($credit_card_number) { // Get the first digit $firstnumber = substr($credit_card_number, 0, 1); // Make sure it is the correct amount of digits. Account for dashes being present. switch ($firstnumber) { case 3: if (!preg_match('/^3\d{3}[ \-]?\d{6}[ \-]?\d{5}$/', $credit_card_number)) { return 'This is not a valid American Express card number'; } break; case 4: if (!preg_match('/^4\d{3}[ \-]?\d{4}[ \-]?\d{4}[ \-]?\d{4}$/', $credit_card_number)) { return 'This is not a valid Visa card number'; } break; case 5: if (!preg_match('/^5\d{3}[ \-]?\d{4}[ \-]?\d{4}[ \-]?\d{4}$/', $credit_card_number)) { return 'This is not a valid MasterCard card number'; } break; case 6: if (!preg_match('/^6011[ \-]?\d{4}[ \-]?\d{4}[ \-]?\d{4}$/', $credit_card_number)) { return 'This is not a valid Discover card number'; } break; default: return 'This is not a valid credit card number'; } // Here's where we use the Luhn Algorithm $credit_card_number = str_replace('-', '', $credit_card_number); $map = array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 2, 4, 6, 8, 1, 3, 5, 7, 9); $sum = 0; $last = strlen($credit_card_number) - 1; for ($i = 0; $i <= $last; $i++) { $sum += $map[$credit_card_number[$last - $i] + ($i & 1) * 10]; } if ($sum % 10 != 0) { return 'This is not a valid credit card number'; } // If we made it this far the credit card number is in a valid format return 'This is a valid credit card number'; } echo validateCreditcard_number('4111-1111-1111-1111'); // This is a valid credit card number echo validateCreditcard_number('4111-1111-1111-1112'); // This is not a valid credit card number echo validateCreditcard_number('5558-545f-1234'); // This is not a valid MasterCard card number echo validateCreditcard_number('9876-5432-1012-3456'); // This is not a valid credit card number