20
20
* @author Manuel Reinhard <[email protected] >
21
21
* @author Michael Schummel
22
22
* @author Bernhard Schussek <[email protected] >
23
- *
24
- * @see http://www.michael-schummel.de/2007/10/05/iban-prufung-mit-php/
25
23
*/
26
24
class IbanValidator extends ConstraintValidator
27
25
{
@@ -34,107 +32,135 @@ class IbanValidator extends ConstraintValidator
34
32
* a BBAN (Basic Bank Account Number) which has a fixed length per country and,
35
33
* included within it, a bank identifier with a fixed position and a fixed length per country
36
34
*
37
- * @see https://www.swift.com/sites/default/files/resources/iban_registry.pdf
35
+ * @see Resources/bin/sync-iban-formats.php
36
+ * @see https://www.swift.com/swift-resource/11971/download?language=en
37
+ * @see https://en.wikipedia.org/wiki/International_Bank_Account_Number
38
38
*/
39
39
private const FORMATS = [
40
+ // auto-generated
40
41
'AD ' => 'AD\d{2}\d{4}\d{4}[\dA-Z]{12} ' , // Andorra
41
- 'AE ' => 'AE\d{2}\d{3}\d{16} ' , // United Arab Emirates
42
+ 'AE ' => 'AE\d{2}\d{3}\d{16} ' , // United Arab Emirates (The)
42
43
'AL ' => 'AL\d{2}\d{8}[\dA-Z]{16} ' , // Albania
43
44
'AO ' => 'AO\d{2}\d{21} ' , // Angola
44
45
'AT ' => 'AT\d{2}\d{5}\d{11} ' , // Austria
45
- 'AX ' => 'FI\d{2}\d{6 }\d{7}\d{1} ' , // Aland Islands
46
+ 'AX ' => 'FI\d{2}\d{3 }\d{11} ' , // Finland
46
47
'AZ ' => 'AZ\d{2}[A-Z]{4}[\dA-Z]{20} ' , // Azerbaijan
47
48
'BA ' => 'BA\d{2}\d{3}\d{3}\d{8}\d{2} ' , // Bosnia and Herzegovina
48
49
'BE ' => 'BE\d{2}\d{3}\d{7}\d{2} ' , // Belgium
49
- 'BF ' => 'BF\d{2}\d{23 } ' , // Burkina Faso
50
+ 'BF ' => 'BF\d{2}[\dA-Z]{2}\d{22 } ' , // Burkina Faso
50
51
'BG ' => 'BG\d{2}[A-Z]{4}\d{4}\d{2}[\dA-Z]{8} ' , // Bulgaria
51
52
'BH ' => 'BH\d{2}[A-Z]{4}[\dA-Z]{14} ' , // Bahrain
52
- 'BI ' => 'BI\d{2}\d{12} ' , // Burundi
53
- 'BJ ' => 'BJ\d{2}[A-Z]{1}\d{23} ' , // Benin
54
- 'BY ' => 'BY\d{2}[\dA-Z]{4}\d{4}[\dA-Z]{16} ' , // Belarus - https://bank.codes/iban/structure/belarus/
55
- 'BL ' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2} ' , // Saint Barthelemy
56
- 'BR ' => 'BR\d{2}\d{8}\d{5}\d{10}[A-Z][\dA-Z] ' , // Brazil
57
- 'CG ' => 'CG\d{2}\d{23} ' , // Congo
53
+ 'BI ' => 'BI\d{2}\d{5}\d{5}\d{11}\d{2} ' , // Burundi
54
+ 'BJ ' => 'BJ\d{2}[\dA-Z]{2}\d{22} ' , // Benin
55
+ 'BL ' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2} ' , // France
56
+ 'BR ' => 'BR\d{2}\d{8}\d{5}\d{10}[A-Z]{1}[\dA-Z]{1} ' , // Brazil
57
+ 'BY ' => 'BY\d{2}[\dA-Z]{4}\d{4}[\dA-Z]{16} ' , // Republic of Belarus
58
+ 'CF ' => 'CF\d{2}\d{23} ' , // Central African Republic
59
+ 'CG ' => 'CG\d{2}\d{23} ' , // Congo, Republic of the
58
60
'CH ' => 'CH\d{2}\d{5}[\dA-Z]{12} ' , // Switzerland
59
- 'CI ' => 'CI\d{2}[A-Z]{1}\d{23} ' , // Ivory Coast
60
- 'CM ' => 'CM\d{2}\d{23} ' , // Cameron
61
- 'CR ' => 'CR\d{2}0 \d{3 }\d{14} ' , // Costa Rica
62
- 'CV ' => 'CV\d{2}\d{21} ' , // Cape Verde
61
+ 'CI ' => 'CI\d{2}[A-Z]{1}\d{23} ' , // Côte d'Ivoire
62
+ 'CM ' => 'CM\d{2}\d{23} ' , // Cameroon
63
+ 'CR ' => 'CR\d{2}\d{4 }\d{14} ' , // Costa Rica
64
+ 'CV ' => 'CV\d{2}\d{21} ' , // Cabo Verde
63
65
'CY ' => 'CY\d{2}\d{3}\d{5}[\dA-Z]{16} ' , // Cyprus
64
- 'CZ ' => 'CZ\d{2}\d{20} ' , // Czech Republic
66
+ 'CZ ' => 'CZ\d{2}\d{4}\d{6}\d{10} ' , // Czechia
65
67
'DE ' => 'DE\d{2}\d{8}\d{10} ' , // Germany
68
+ 'DJ ' => 'DJ\d{2}\d{5}\d{5}\d{11}\d{2} ' , // Djibouti
69
+ 'DK ' => 'DK\d{2}\d{4}\d{9}\d{1} ' , // Denmark
66
70
'DO ' => 'DO\d{2}[\dA-Z]{4}\d{20} ' , // Dominican Republic
67
- 'DK ' => 'DK\d{2}\d{4}\d{10} ' , // Denmark
68
- 'DZ ' => 'DZ\d{2}\d{20} ' , // Algeria
71
+ 'DZ ' => 'DZ\d{2}\d{22} ' , // Algeria
69
72
'EE ' => 'EE\d{2}\d{2}\d{2}\d{11}\d{1} ' , // Estonia
70
- 'ES ' => 'ES\d{2}\d{4}\d{4}\d{1}\d{1}\d{10} ' , // Spain (also includes Canary Islands, Ceuta and Melilla)
71
- 'FI ' => 'FI\d{2}\d{6}\d{7}\d{1} ' , // Finland
73
+ 'EG ' => 'EG\d{2}\d{4}\d{4}\d{17} ' , // Egypt
74
+ 'ES ' => 'ES\d{2}\d{4}\d{4}\d{1}\d{1}\d{10} ' , // Spain
75
+ 'FI ' => 'FI\d{2}\d{3}\d{11} ' , // Finland
72
76
'FO ' => 'FO\d{2}\d{4}\d{9}\d{1} ' , // Faroe Islands
73
77
'FR ' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2} ' , // France
74
- 'GF ' => 'FR \d{2}\d{5}\d{5}[\dA-Z]{11}\d{2} ' , // French Guyana
75
- 'GB ' => 'GB\d{2}[A-Z]{4}\d{6}\d{8} ' , // United Kingdom of Great Britain and Northern Ireland
78
+ 'GA ' => 'GA \d{2}\d{23} ' , // Gabon
79
+ 'GB ' => 'GB\d{2}[A-Z]{4}\d{6}\d{8} ' , // United Kingdom
76
80
'GE ' => 'GE\d{2}[A-Z]{2}\d{16} ' , // Georgia
81
+ 'GF ' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2} ' , // France
82
+ 'GG ' => 'GB\d{2}[A-Z]{4}\d{6}\d{8} ' , // United Kingdom
77
83
'GI ' => 'GI\d{2}[A-Z]{4}[\dA-Z]{15} ' , // Gibraltar
78
84
'GL ' => 'GL\d{2}\d{4}\d{9}\d{1} ' , // Greenland
79
- 'GP ' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2} ' , // Guadeloupe
85
+ 'GP ' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2} ' , // France
86
+ 'GQ ' => 'GQ\d{2}\d{23} ' , // Equatorial Guinea
80
87
'GR ' => 'GR\d{2}\d{3}\d{4}[\dA-Z]{16} ' , // Greece
81
88
'GT ' => 'GT\d{2}[\dA-Z]{4}[\dA-Z]{20} ' , // Guatemala
89
+ 'GW ' => 'GW\d{2}[\dA-Z]{2}\d{19} ' , // Guinea-Bissau
90
+ 'HN ' => 'HN\d{2}[A-Z]{4}\d{20} ' , // Honduras
82
91
'HR ' => 'HR\d{2}\d{7}\d{10} ' , // Croatia
83
92
'HU ' => 'HU\d{2}\d{3}\d{4}\d{1}\d{15}\d{1} ' , // Hungary
84
93
'IE ' => 'IE\d{2}[A-Z]{4}\d{6}\d{8} ' , // Ireland
85
94
'IL ' => 'IL\d{2}\d{3}\d{3}\d{13} ' , // Israel
95
+ 'IM ' => 'GB\d{2}[A-Z]{4}\d{6}\d{8} ' , // United Kingdom
96
+ 'IQ ' => 'IQ\d{2}[A-Z]{4}\d{3}\d{12} ' , // Iraq
86
97
'IR ' => 'IR\d{2}\d{22} ' , // Iran
87
98
'IS ' => 'IS\d{2}\d{4}\d{2}\d{6}\d{10} ' , // Iceland
88
99
'IT ' => 'IT\d{2}[A-Z]{1}\d{5}\d{5}[\dA-Z]{12} ' , // Italy
100
+ 'JE ' => 'GB\d{2}[A-Z]{4}\d{6}\d{8} ' , // United Kingdom
89
101
'JO ' => 'JO\d{2}[A-Z]{4}\d{4}[\dA-Z]{18} ' , // Jordan
90
- 'KW ' => 'KW\d{2}[A-Z]{4}\d{22} ' , // KUWAIT
102
+ 'KM ' => 'KM\d{2}\d{23} ' , // Comoros
103
+ 'KW ' => 'KW\d{2}[A-Z]{4}[\dA-Z]{22} ' , // Kuwait
91
104
'KZ ' => 'KZ\d{2}\d{3}[\dA-Z]{13} ' , // Kazakhstan
92
- 'LB ' => 'LB\d{2}\d{4}[\dA-Z]{20} ' , // LEBANON
93
- 'LI ' => 'LI\d{2}\d{5}[\dA-Z]{12} ' , // Liechtenstein (Principality of)
105
+ 'LB ' => 'LB\d{2}\d{4}[\dA-Z]{20} ' , // Lebanon
106
+ 'LC ' => 'LC\d{2}[A-Z]{4}[\dA-Z]{24} ' , // Saint Lucia
107
+ 'LI ' => 'LI\d{2}\d{5}[\dA-Z]{12} ' , // Liechtenstein
94
108
'LT ' => 'LT\d{2}\d{5}\d{11} ' , // Lithuania
95
109
'LU ' => 'LU\d{2}\d{3}[\dA-Z]{13} ' , // Luxembourg
96
110
'LV ' => 'LV\d{2}[A-Z]{4}[\dA-Z]{13} ' , // Latvia
111
+ 'LY ' => 'LY\d{2}\d{3}\d{3}\d{15} ' , // Libya
112
+ 'MA ' => 'MA\d{2}\d{24} ' , // Morocco
97
113
'MC ' => 'MC\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2} ' , // Monaco
98
114
'MD ' => 'MD\d{2}[\dA-Z]{2}[\dA-Z]{18} ' , // Moldova
99
115
'ME ' => 'ME\d{2}\d{3}\d{13}\d{2} ' , // Montenegro
100
- 'MF ' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2} ' , // Saint Martin (French part)
116
+ 'MF ' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2} ' , // France
101
117
'MG ' => 'MG\d{2}\d{23} ' , // Madagascar
102
- 'MK ' => 'MK\d{2}\d{3}[\dA-Z]{10}\d{2} ' , // Macedonia, Former Yugoslav Republic of
103
- 'ML ' => 'ML\d{2}[A -Z]{1 }\d{23 } ' , // Mali
104
- 'MQ ' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2} ' , // Martinique
118
+ 'MK ' => 'MK\d{2}\d{3}[\dA-Z]{10}\d{2} ' , // Macedonia
119
+ 'ML ' => 'ML\d{2}[\dA -Z]{2 }\d{22 } ' , // Mali
120
+ 'MQ ' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2} ' , // France
105
121
'MR ' => 'MR\d{2}\d{5}\d{5}\d{11}\d{2} ' , // Mauritania
106
122
'MT ' => 'MT\d{2}[A-Z]{4}\d{5}[\dA-Z]{18} ' , // Malta
107
123
'MU ' => 'MU\d{2}[A-Z]{4}\d{2}\d{2}\d{12}\d{3}[A-Z]{3} ' , // Mauritius
108
124
'MZ ' => 'MZ\d{2}\d{21} ' , // Mozambique
109
- 'NC ' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2} ' , // New Caledonia
110
- 'NL ' => 'NL\d{2}[A-Z]{4}\d{10} ' , // The Netherlands
125
+ 'NC ' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2} ' , // France
126
+ 'NE ' => 'NE\d{2}[A-Z]{2}\d{22} ' , // Niger
127
+ 'NI ' => 'NI\d{2}[A-Z]{4}\d{24} ' , // Nicaragua
128
+ 'NL ' => 'NL\d{2}[A-Z]{4}\d{10} ' , // Netherlands (The)
111
129
'NO ' => 'NO\d{2}\d{4}\d{6}\d{1} ' , // Norway
112
- 'PF ' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2} ' , // French Polynesia
130
+ 'PF ' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2} ' , // France
113
131
'PK ' => 'PK\d{2}[A-Z]{4}[\dA-Z]{16} ' , // Pakistan
114
132
'PL ' => 'PL\d{2}\d{8}\d{16} ' , // Poland
115
- 'PM ' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2} ' , // Saint Pierre et Miquelon
133
+ 'PM ' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2} ' , // France
116
134
'PS ' => 'PS\d{2}[A-Z]{4}[\dA-Z]{21} ' , // Palestine, State of
117
- 'PT ' => 'PT\d{2}\d{4}\d{4}\d{11}\d{2} ' , // Portugal (plus Azores and Madeira)
135
+ 'PT ' => 'PT\d{2}\d{4}\d{4}\d{11}\d{2} ' , // Portugal
118
136
'QA ' => 'QA\d{2}[A-Z]{4}[\dA-Z]{21} ' , // Qatar
119
- 'RE ' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2} ' , // Reunion
137
+ 'RE ' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2} ' , // France
120
138
'RO ' => 'RO\d{2}[A-Z]{4}[\dA-Z]{16} ' , // Romania
121
139
'RS ' => 'RS\d{2}\d{3}\d{13}\d{2} ' , // Serbia
140
+ 'RU ' => 'RU\d{2}\d{9}\d{5}[\dA-Z]{15} ' , // Russia
122
141
'SA ' => 'SA\d{2}\d{2}[\dA-Z]{18} ' , // Saudi Arabia
142
+ 'SC ' => 'SC\d{2}[A-Z]{4}\d{2}\d{2}\d{16}[A-Z]{3} ' , // Seychelles
143
+ 'SD ' => 'SD\d{2}\d{2}\d{12} ' , // Sudan
123
144
'SE ' => 'SE\d{2}\d{3}\d{16}\d{1} ' , // Sweden
124
145
'SI ' => 'SI\d{2}\d{5}\d{8}\d{2} ' , // Slovenia
125
- 'SK ' => 'SK\d{2}\d{4}\d{6}\d{10} ' , // Slovak Republic
146
+ 'SK ' => 'SK\d{2}\d{4}\d{6}\d{10} ' , // Slovakia
126
147
'SM ' => 'SM\d{2}[A-Z]{1}\d{5}\d{5}[\dA-Z]{12} ' , // San Marino
127
- 'SN ' => 'SN\d{2}[A-Z]{1}\d{23} ' , // Senegal
128
- 'TF ' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2} ' , // French Southern Territories
148
+ 'SN ' => 'SN\d{2}[A-Z]{2}\d{22} ' , // Senegal
149
+ 'SO ' => 'SO\d{2}\d{4}\d{3}\d{12} ' , // Somalia
150
+ 'ST ' => 'ST\d{2}\d{4}\d{4}\d{11}\d{2} ' , // Sao Tome and Principe
151
+ 'SV ' => 'SV\d{2}[A-Z]{4}\d{20} ' , // El Salvador
152
+ 'TD ' => 'TD\d{2}\d{23} ' , // Chad
153
+ 'TF ' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2} ' , // France
154
+ 'TG ' => 'TG\d{2}[A-Z]{2}\d{22} ' , // Togo
129
155
'TL ' => 'TL\d{2}\d{3}\d{14}\d{2} ' , // Timor-Leste
130
156
'TN ' => 'TN\d{2}\d{2}\d{3}\d{13}\d{2} ' , // Tunisia
131
- 'TR ' => 'TR\d{2}\d{5}[\dA-Z] {1}[\dA-Z]{16} ' , // Turkey
157
+ 'TR ' => 'TR\d{2}\d{5}\d {1}[\dA-Z]{16} ' , // Turkey
132
158
'UA ' => 'UA\d{2}\d{6}[\dA-Z]{19} ' , // Ukraine
133
159
'VA ' => 'VA\d{2}\d{3}\d{15} ' , // Vatican City State
134
- 'VG ' => 'VG\d{2}[A-Z]{4}\d{16} ' , // Virgin Islands, British
135
- 'WF ' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2} ' , // Wallis and Futuna Islands
136
- 'XK ' => 'XK\d{2}\d{4}\d{10}\d{2} ' , // Republic of Kosovo
137
- 'YT ' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2} ' , // Mayotte
160
+ 'VG ' => 'VG\d{2}[A-Z]{4}\d{16} ' , // Virgin Islands
161
+ 'WF ' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2} ' , // France
162
+ 'XK ' => 'XK\d{2}\d{4}\d{10}\d{2} ' , // Kosovo
163
+ 'YT ' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2} ' , // France
138
164
];
139
165
140
166
/**
0 commit comments