PX : code

Ultimate Credit Card Validation Function by Lew Payne
Rating: 5.00
Download this code


#
#  Validate type, length and modulus of credit card.
#  Returns TRUE if number sequence is valid, else FALSE
#  Also returns card type in $cctype for any attempts.
#  Developed by: Lew Payne <lew@persiankitty.com>
#
Function CardCheck( $ccnum,$cctype=\'\' ) {
  if( !isset($ccnum) ) return FALSE;
  //  Make credit card number purely numeric
  $ccnum = ereg_replace( \'[^[:digit:]]+\',\'\',$ccnum );
  //  Validate digit length for Visa
  if( ereg(\'^4\',$ccnum) ) {
    $cctype = \"VISA\";
    if( strlen($ccnum)<>13 && strlen($ccnum)<>16 ) return FALSE;
  }
  //  Validate digit length for MasterCard
  if( ereg(\'^5[1-5]\',$ccnum) ) {
    $cctype = \"MAST\";
    if( strlen($ccnum)<>16 ) return FALSE;
  }
  //  Validate digit length for American Express
  if( ereg(\'^3[47]\',$ccnum) ) {
    $cctype = \"AMEX\";
    if( strlen($ccnum)<>15 ) return FALSE;
  }
  //  Validate digit length for Discover/Novus
  if( ereg(\'^6011\',$ccnum) ) {
    $cctype = \"DISC\";
    if( strlen($ccnum)<>16 ) return FALSE;
  }
  //  Validate digit length for Diner\'s Club
  if( (ereg(\'^3[0-5]\',$ccnum))||(ereg(\'^3[68]\',$ccnum)) ) {
    $cctype = \"DINE\";
    if( strlen($ccnum)<>14 ) return FALSE;
  }
  //  Validate digit length for Carte Blanche
  if( ereg(\'^389\',$ccnum) ) {
    $cctype = \"CART\";
    if( strlen($ccnum)<>14 ) return FALSE;
  }
  //  Validate digit length for JCB Card
  if( ereg(\'^35[2-8]\',$ccnum) ) {
    $cctype = \"JCB\";
    if( strlen($ccnum)<>16 ) return FALSE;
  }
  //  Validate digit length for Australian BankCard
  if( ereg(\'^5610\',$ccnum) ) {
    $cctype = \"AUST\";
    if( strlen($ccnum)<>16 ) return FALSE;
  }
  //  Perform LUHN (mod10) test on card number
  $sum = 0;
  $len = strlen( $ccnum );
  //  Double every other digit from *right* to left
  $mask = substr( \"2121212121212121\",16-$len,$len );
  //  Now iterate and operate on credit card digits
  for( $idx=0; $idx<$len; $idx++ ) {
    $digit = substr( $ccnum,$idx,1 );
    $mult = substr( $mask,$idx,1 );
    if( $mult==\"2\" ) {
      $sum += ( $digit>=5 ) ? 1+( ($digit*2)%10 ) : $digit*2;
    } else {
      $sum += $digit;
    }
  }
  if( $sum%10 ) return FALSE;
  //  No mod10 remainder, card sequence is valid!
  return TRUE;
};

Comments or questions?
PX is running PHP 5.2.17
Thanks to Miranda Productions for hosting and bandwidth.
Use of any code from PX is at your own risk.