Skip to content

Commit 3937610

Browse files
smeleshnicolas-grekas
authored andcommitted
[Validator] Sync IBAN formats with Swift IBAN registry
1 parent 29f46fc commit 3937610

File tree

4 files changed

+352
-106
lines changed

4 files changed

+352
-106
lines changed

src/Symfony/Component/Validator/.gitattributes

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@
22
/phpunit.xml.dist export-ignore
33
/.gitattributes export-ignore
44
/.gitignore export-ignore
5+
/Resources/bin/sync-iban-formats.php export-ignore

src/Symfony/Component/Validator/Constraints/IbanValidator.php

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

140170
/**

0 commit comments

Comments
 (0)