web/lib/Zend/Validate/Iban.php
changeset 64 162c1de6545a
parent 19 1c2f13fd785c
child 68 ecaf28ffe26e
equal deleted inserted replaced
63:5b37998e522e 64:162c1de6545a
       
     1 <?php
       
     2 /**
       
     3  * Zend Framework
       
     4  *
       
     5  * LICENSE
       
     6  *
       
     7  * This source file is subject to the new BSD license that is bundled
       
     8  * with this package in the file LICENSE.txt.
       
     9  * It is also available through the world-wide-web at this URL:
       
    10  * http://framework.zend.com/license/new-bsd
       
    11  * If you did not receive a copy of the license and are unable to
       
    12  * obtain it through the world-wide-web, please send an email
       
    13  * to license@zend.com so we can send you a copy immediately.
       
    14  *
       
    15  * @category   Zend
       
    16  * @package    Zend_Validate
       
    17  * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
       
    18  * @license    http://framework.zend.com/license/new-bsd     New BSD License
       
    19  * @version    $Id: Iban.php 22400 2010-06-09 19:25:02Z thomas $
       
    20  */
       
    21 
       
    22 /**
       
    23  * @see Zend_Validate_Abstract
       
    24  */
       
    25 require_once 'Zend/Validate/Abstract.php';
       
    26 
       
    27 /**
       
    28  * Validates IBAN Numbers (International Bank Account Numbers)
       
    29  *
       
    30  * @category   Zend
       
    31  * @package    Zend_Validate
       
    32  * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
       
    33  * @license    http://framework.zend.com/license/new-bsd     New BSD License
       
    34  */
       
    35 class Zend_Validate_Iban extends Zend_Validate_Abstract
       
    36 {
       
    37     const NOTSUPPORTED = 'ibanNotSupported';
       
    38     const FALSEFORMAT  = 'ibanFalseFormat';
       
    39     const CHECKFAILED  = 'ibanCheckFailed';
       
    40 
       
    41     /**
       
    42      * Validation failure message template definitions
       
    43      *
       
    44      * @var array
       
    45      */
       
    46     protected $_messageTemplates = array(
       
    47         self::NOTSUPPORTED => "Unknown country within the IBAN '%value%'",
       
    48         self::FALSEFORMAT  => "'%value%' has a false IBAN format",
       
    49         self::CHECKFAILED  => "'%value%' has failed the IBAN check",
       
    50     );
       
    51 
       
    52     /**
       
    53      * Optional locale
       
    54      *
       
    55      * @var string|Zend_Locale|null
       
    56      */
       
    57     protected $_locale;
       
    58 
       
    59     /**
       
    60      * IBAN regexes by region
       
    61      *
       
    62      * @var array
       
    63      */
       
    64     protected $_ibanregex = array(
       
    65         'AD' => '/^AD[0-9]{2}[0-9]{8}[A-Z0-9]{12}$/',
       
    66         'AT' => '/^AT[0-9]{2}[0-9]{5}[0-9]{11}$/',
       
    67         'BA' => '/^BA[0-9]{2}[0-9]{6}[0-9]{10}$/',
       
    68         'BE' => '/^BE[0-9]{2}[0-9]{3}[0-9]{9}$/',
       
    69         'BG' => '/^BG[0-9]{2}[A-Z]{4}[0-9]{4}[0-9]{2}[A-Z0-9]{8}$/',
       
    70         'CH' => '/^CH[0-9]{2}[0-9]{5}[A-Z0-9]{12}$/',
       
    71         'CS' => '/^CS[0-9]{2}[0-9]{3}[0-9]{15}$/',
       
    72         'CY' => '/^CY[0-9]{2}[0-9]{8}[A-Z0-9]{16}$/',
       
    73         'CZ' => '/^CZ[0-9]{2}[0-9]{4}[0-9]{16}$/',
       
    74         'DE' => '/^DE[0-9]{2}[0-9]{8}[0-9]{10}$/',
       
    75         'DK' => '/^DK[0-9]{2}[0-9]{4}[0-9]{10}$/',
       
    76         'EE' => '/^EE[0-9]{2}[0-9]{4}[0-9]{12}$/',
       
    77         'ES' => '/^ES[0-9]{2}[0-9]{8}[0-9]{12}$/',
       
    78         'FR' => '/^FR[0-9]{2}[0-9]{10}[A-Z0-9]{13}$/',
       
    79         'FI' => '/^FI[0-9]{2}[0-9]{6}[0-9]{8}$/',
       
    80         'GB' => '/^GB[0-9]{2}[A-Z]{4}[0-9]{14}$/',
       
    81         'GI' => '/^GI[0-9]{2}[A-Z]{4}[A-Z0-9]{15}$/',
       
    82         'GR' => '/^GR[0-9]{2}[0-9]{7}[A-Z0-9]{16}$/',
       
    83         'HR' => '/^HR[0-9]{2}[0-9]{7}[0-9]{10}$/',
       
    84         'HU' => '/^HU[0-9]{2}[0-9]{7}[0-9]{1}[0-9]{15}[0-9]{1}$/',
       
    85         'IE' => '/^IE[0-9]{2}[A-Z0-9]{4}[0-9]{6}[0-9]{8}$/',
       
    86         'IS' => '/^IS[0-9]{2}[0-9]{4}[0-9]{18}$/',
       
    87         'IT' => '/^IT[0-9]{2}[A-Z]{1}[0-9]{10}[A-Z0-9]{12}$/',
       
    88         'LI' => '/^LI[0-9]{2}[0-9]{5}[A-Z0-9]{12}$/',
       
    89         'LU' => '/^LU[0-9]{2}[0-9]{3}[A-Z0-9]{13}$/',
       
    90         'LT' => '/^LT[0-9]{2}[0-9]{5}[0-9]{11}$/',
       
    91         'LV' => '/^LV[0-9]{2}[A-Z]{4}[A-Z0-9]{13}$/',
       
    92         'MK' => '/^MK[0-9]{2}[A-Z]{3}[A-Z0-9]{10}[0-9]{2}$/',
       
    93         'MT' => '/^MT[0-9]{2}[A-Z]{4}[0-9]{5}[A-Z0-9]{18}$/',
       
    94         'NL' => '/^NL[0-9]{2}[A-Z]{4}[0-9]{10}$/',
       
    95         'NO' => '/^NO[0-9]{2}[0-9]{4}[0-9]{7}$/',
       
    96         'PL' => '/^PL[0-9]{2}[0-9]{8}[0-9]{16}$/',
       
    97         'PT' => '/^PT[0-9]{2}[0-9]{8}[0-9]{13}$/',
       
    98         'RO' => '/^RO[0-9]{2}[A-Z]{4}[A-Z0-9]{16}$/',
       
    99         'SE' => '/^SE[0-9]{2}[0-9]{3}[0-9]{17}$/',
       
   100         'SI' => '/^SI[0-9]{2}[0-9]{5}[0-9]{8}[0-9]{2}$/',
       
   101         'SK' => '/^SK[0-9]{2}[0-9]{4}[0-9]{16}$/',
       
   102         'TN' => '/^TN[0-9]{2}[0-9]{5}[0-9]{15}$/',
       
   103         'TR' => '/^TR[0-9]{2}[0-9]{5}[A-Z0-9]{17}$/'
       
   104     );
       
   105 
       
   106     /**
       
   107      * Sets validator options
       
   108      *
       
   109      * @param  string|Zend_Config|Zend_Locale $locale OPTIONAL
       
   110      * @return void
       
   111      */
       
   112     public function __construct($locale = null)
       
   113     {
       
   114         if ($locale instanceof Zend_Config) {
       
   115             $locale = $locale->toArray();
       
   116         }
       
   117 
       
   118         if (is_array($locale)) {
       
   119             if (array_key_exists('locale', $locale)) {
       
   120                 $locale = $locale['locale'];
       
   121             } else {
       
   122                 $locale = null;
       
   123             }
       
   124         }
       
   125 
       
   126         if (empty($locale)) {
       
   127             require_once 'Zend/Registry.php';
       
   128             if (Zend_Registry::isRegistered('Zend_Locale')) {
       
   129                 $locale = Zend_Registry::get('Zend_Locale');
       
   130             }
       
   131         }
       
   132 
       
   133         if ($locale !== null) {
       
   134             $this->setLocale($locale);
       
   135         }
       
   136     }
       
   137 
       
   138     /**
       
   139      * Returns the locale option
       
   140      *
       
   141      * @return string|Zend_Locale|null
       
   142      */
       
   143     public function getLocale()
       
   144     {
       
   145         return $this->_locale;
       
   146     }
       
   147 
       
   148     /**
       
   149      * Sets the locale option
       
   150      *
       
   151      * @param  string|Zend_Locale $locale
       
   152      * @return Zend_Validate_Date provides a fluent interface
       
   153      */
       
   154     public function setLocale($locale = null)
       
   155     {
       
   156         if ($locale !== false) {
       
   157             require_once 'Zend/Locale.php';
       
   158             $locale = Zend_Locale::findLocale($locale);
       
   159             if (strlen($locale) < 4) {
       
   160                 require_once 'Zend/Validate/Exception.php';
       
   161                 throw new Zend_Validate_Exception('Region must be given for IBAN validation');
       
   162             }
       
   163         }
       
   164 
       
   165         $this->_locale = $locale;
       
   166         return $this;
       
   167     }
       
   168 
       
   169     /**
       
   170      * Defined by Zend_Validate_Interface
       
   171      *
       
   172      * Returns true if $value is a valid IBAN
       
   173      *
       
   174      * @param  string $value
       
   175      * @return boolean
       
   176      */
       
   177     public function isValid($value)
       
   178     {
       
   179         $value = strtoupper($value);
       
   180         $this->_setValue($value);
       
   181 
       
   182         if (empty($this->_locale)) {
       
   183             $region = substr($value, 0, 2);
       
   184         } else {
       
   185             $region = new Zend_Locale($this->_locale);
       
   186             $region = $region->getRegion();
       
   187         }
       
   188 
       
   189         if (!array_key_exists($region, $this->_ibanregex)) {
       
   190             $this->_setValue($region);
       
   191             $this->_error(self::NOTSUPPORTED);
       
   192             return false;
       
   193         }
       
   194 
       
   195         if (!preg_match($this->_ibanregex[$region], $value)) {
       
   196             $this->_error(self::FALSEFORMAT);
       
   197             return false;
       
   198         }
       
   199 
       
   200         $format = substr($value, 4) . substr($value, 0, 4);
       
   201         $format = str_replace(
       
   202             array('A',  'B',  'C',  'D',  'E',  'F',  'G',  'H',  'I',  'J',  'K',  'L',  'M',
       
   203                   'N',  'O',  'P',  'Q',  'R',  'S',  'T',  'U',  'V',  'W',  'X',  'Y',  'Z'),
       
   204             array('10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22',
       
   205                   '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35'),
       
   206             $format);
       
   207 
       
   208         $temp = intval(substr($format, 0, 1));
       
   209         $len  = strlen($format);
       
   210         for ($x = 1; $x < $len; ++$x) {
       
   211             $temp *= 10;
       
   212             $temp += intval(substr($format, $x, 1));
       
   213             $temp %= 97;
       
   214         }
       
   215 
       
   216         if ($temp != 1) {
       
   217             $this->_error(self::CHECKFAILED);
       
   218             return false;
       
   219         }
       
   220 
       
   221         return true;
       
   222     }
       
   223 }