An IBAN is validated by converting it into an integer and performing a basic mod-97 operation (as described in ISO 7064) on it. If the IBAN is valid, the remainder equals 1.
The flowing piece of PHP code will preform a equivalent of this check for you and return true for a IBAN with a valid check-sum number.
#!/usr/bin/php <?php $account = "NL20INGB0001234567"; function checkIBAN($iban) { // Normalize input (remove spaces and make upcase) $iban = strtoupper(str_replace(' ', '', $iban)); if (preg_match('/^[A-Z]{2}[0-9]{2}[A-Z0-9]{1,30}$/', $iban)) { $country = substr($iban, 0, 2); $check = intval(substr($iban, 2, 2)); $account = substr($iban, 4); // To numeric representation $search = range('A','Z'); foreach (range(10,35) as $tmp) $replace[]=strval($tmp); $numstr=str_replace($search, $replace, $account.$country.'00'); // Calculate checksum $checksum = intval(substr($numstr, 0, 1)); for ($pos = 1; $pos < strlen($numstr); $pos++) { $checksum *= 10; $checksum += intval(substr($numstr, $pos,1)); $checksum %= 97; } return ((98-$checksum) == $check); } else return false; } if (checkIBAN($account)) echo 'IBAN: '.wordwrap($account, 4, ' ', true)."\n"; else echo "No valid IBAN account number\n"; ?>
This check does only perform a checksum check. It does not validate country specific characteristics (length and format)