php-iban über composer einbinden
Bernd Wurst

Bernd Wurst commited on 2018-01-23 18:20:13
Zeige 22 geänderte Dateien mit 31 Einfügungen und 1981 Löschungen.

... ...
@@ -4,6 +4,7 @@
4 4
     "license": "CC0-1.0",
5 5
     "require": {
6 6
         "bjeavons/zxcvbn-php": "0.3",
7
-        "giggsey/libphonenumber-for-php": "^8.8"
7
+        "giggsey/libphonenumber-for-php": "^8.8",
8
+        "globalcitizen/php-iban": "^2.6"
8 9
     }
9 10
 }
... ...
@@ -4,7 +4,7 @@
4 4
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
5 5
         "This file is @generated automatically"
6 6
     ],
7
-    "content-hash": "d145356ef169caa8b33d4fe59422b14d",
7
+    "content-hash": "8e82fcd9fc27b40fafb297fc10633829",
8 8
     "packages": [
9 9
         {
10 10
             "name": "bjeavons/zxcvbn-php",
... ...
@@ -167,6 +167,34 @@
167 167
             ],
168 168
             "description": "Locale functions required by libphonenumber-for-php",
169 169
             "time": "2017-11-01T21:34:27+00:00"
170
+        },
171
+        {
172
+            "name": "globalcitizen/php-iban",
173
+            "version": "v2.6.1",
174
+            "source": {
175
+                "type": "git",
176
+                "url": "https://github.com/globalcitizen/php-iban.git",
177
+                "reference": "3de32bd2c02ebb5fe0694fd28d2d1a5d2f0ec291"
178
+            },
179
+            "dist": {
180
+                "type": "zip",
181
+                "url": "https://api.github.com/repos/globalcitizen/php-iban/zipball/3de32bd2c02ebb5fe0694fd28d2d1a5d2f0ec291",
182
+                "reference": "3de32bd2c02ebb5fe0694fd28d2d1a5d2f0ec291",
183
+                "shasum": ""
184
+            },
185
+            "type": "library",
186
+            "autoload": {
187
+                "files": [
188
+                    "oophp-iban.php",
189
+                    "php-iban.php"
190
+                ]
191
+            },
192
+            "notification-url": "https://packagist.org/downloads/",
193
+            "license": [
194
+                "LGPL-3.0"
195
+            ],
196
+            "description": "php-iban is a library for parsing and validating IBAN (and IIBAN) bank account information.",
197
+            "time": "2017-08-10T17:28:10+00:00"
170 198
         }
171 199
     ],
172 200
     "packages-dev": [],
... ...
@@ -1,165 +0,0 @@
1
-                   GNU LESSER GENERAL PUBLIC LICENSE
2
-                       Version 3, 29 June 2007
3
-
4
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
5
- Everyone is permitted to copy and distribute verbatim copies
6
- of this license document, but changing it is not allowed.
7
-
8
-
9
-  This version of the GNU Lesser General Public License incorporates
10
-the terms and conditions of version 3 of the GNU General Public
11
-License, supplemented by the additional permissions listed below.
12
-
13
-  0. Additional Definitions.
14
-
15
-  As used herein, "this License" refers to version 3 of the GNU Lesser
16
-General Public License, and the "GNU GPL" refers to version 3 of the GNU
17
-General Public License.
18
-
19
-  "The Library" refers to a covered work governed by this License,
20
-other than an Application or a Combined Work as defined below.
21
-
22
-  An "Application" is any work that makes use of an interface provided
23
-by the Library, but which is not otherwise based on the Library.
24
-Defining a subclass of a class defined by the Library is deemed a mode
25
-of using an interface provided by the Library.
26
-
27
-  A "Combined Work" is a work produced by combining or linking an
28
-Application with the Library.  The particular version of the Library
29
-with which the Combined Work was made is also called the "Linked
30
-Version".
31
-
32
-  The "Minimal Corresponding Source" for a Combined Work means the
33
-Corresponding Source for the Combined Work, excluding any source code
34
-for portions of the Combined Work that, considered in isolation, are
35
-based on the Application, and not on the Linked Version.
36
-
37
-  The "Corresponding Application Code" for a Combined Work means the
38
-object code and/or source code for the Application, including any data
39
-and utility programs needed for reproducing the Combined Work from the
40
-Application, but excluding the System Libraries of the Combined Work.
41
-
42
-  1. Exception to Section 3 of the GNU GPL.
43
-
44
-  You may convey a covered work under sections 3 and 4 of this License
45
-without being bound by section 3 of the GNU GPL.
46
-
47
-  2. Conveying Modified Versions.
48
-
49
-  If you modify a copy of the Library, and, in your modifications, a
50
-facility refers to a function or data to be supplied by an Application
51
-that uses the facility (other than as an argument passed when the
52
-facility is invoked), then you may convey a copy of the modified
53
-version:
54
-
55
-   a) under this License, provided that you make a good faith effort to
56
-   ensure that, in the event an Application does not supply the
57
-   function or data, the facility still operates, and performs
58
-   whatever part of its purpose remains meaningful, or
59
-
60
-   b) under the GNU GPL, with none of the additional permissions of
61
-   this License applicable to that copy.
62
-
63
-  3. Object Code Incorporating Material from Library Header Files.
64
-
65
-  The object code form of an Application may incorporate material from
66
-a header file that is part of the Library.  You may convey such object
67
-code under terms of your choice, provided that, if the incorporated
68
-material is not limited to numerical parameters, data structure
69
-layouts and accessors, or small macros, inline functions and templates
70
-(ten or fewer lines in length), you do both of the following:
71
-
72
-   a) Give prominent notice with each copy of the object code that the
73
-   Library is used in it and that the Library and its use are
74
-   covered by this License.
75
-
76
-   b) Accompany the object code with a copy of the GNU GPL and this license
77
-   document.
78
-
79
-  4. Combined Works.
80
-
81
-  You may convey a Combined Work under terms of your choice that,
82
-taken together, effectively do not restrict modification of the
83
-portions of the Library contained in the Combined Work and reverse
84
-engineering for debugging such modifications, if you also do each of
85
-the following:
86
-
87
-   a) Give prominent notice with each copy of the Combined Work that
88
-   the Library is used in it and that the Library and its use are
89
-   covered by this License.
90
-
91
-   b) Accompany the Combined Work with a copy of the GNU GPL and this license
92
-   document.
93
-
94
-   c) For a Combined Work that displays copyright notices during
95
-   execution, include the copyright notice for the Library among
96
-   these notices, as well as a reference directing the user to the
97
-   copies of the GNU GPL and this license document.
98
-
99
-   d) Do one of the following:
100
-
101
-       0) Convey the Minimal Corresponding Source under the terms of this
102
-       License, and the Corresponding Application Code in a form
103
-       suitable for, and under terms that permit, the user to
104
-       recombine or relink the Application with a modified version of
105
-       the Linked Version to produce a modified Combined Work, in the
106
-       manner specified by section 6 of the GNU GPL for conveying
107
-       Corresponding Source.
108
-
109
-       1) Use a suitable shared library mechanism for linking with the
110
-       Library.  A suitable mechanism is one that (a) uses at run time
111
-       a copy of the Library already present on the user's computer
112
-       system, and (b) will operate properly with a modified version
113
-       of the Library that is interface-compatible with the Linked
114
-       Version.
115
-
116
-   e) Provide Installation Information, but only if you would otherwise
117
-   be required to provide such information under section 6 of the
118
-   GNU GPL, and only to the extent that such information is
119
-   necessary to install and execute a modified version of the
120
-   Combined Work produced by recombining or relinking the
121
-   Application with a modified version of the Linked Version. (If
122
-   you use option 4d0, the Installation Information must accompany
123
-   the Minimal Corresponding Source and Corresponding Application
124
-   Code. If you use option 4d1, you must provide the Installation
125
-   Information in the manner specified by section 6 of the GNU GPL
126
-   for conveying Corresponding Source.)
127
-
128
-  5. Combined Libraries.
129
-
130
-  You may place library facilities that are a work based on the
131
-Library side by side in a single library together with other library
132
-facilities that are not Applications and are not covered by this
133
-License, and convey such a combined library under terms of your
134
-choice, if you do both of the following:
135
-
136
-   a) Accompany the combined library with a copy of the same work based
137
-   on the Library, uncombined with any other library facilities,
138
-   conveyed under the terms of this License.
139
-
140
-   b) Give prominent notice with the combined library that part of it
141
-   is a work based on the Library, and explaining where to find the
142
-   accompanying uncombined form of the same work.
143
-
144
-  6. Revised Versions of the GNU Lesser General Public License.
145
-
146
-  The Free Software Foundation may publish revised and/or new versions
147
-of the GNU Lesser General Public License from time to time. Such new
148
-versions will be similar in spirit to the present version, but may
149
-differ in detail to address new problems or concerns.
150
-
151
-  Each version is given a distinguishing version number. If the
152
-Library as you received it specifies that a certain numbered version
153
-of the GNU Lesser General Public License "or any later version"
154
-applies to it, you have the option of following the terms and
155
-conditions either of that published version or of any later version
156
-published by the Free Software Foundation. If the Library as you
157
-received it does not specify a version number of the GNU Lesser
158
-General Public License, you may choose any version of the GNU Lesser
159
-General Public License ever published by the Free Software Foundation.
160
-
161
-  If the Library as you received it specifies that a proxy can decide
162
-whether future versions of the GNU Lesser General Public License shall
163
-apply, that proxy's public statement of acceptance of any version is
164
-permanent authorization for you to choose that version for the
165
-Library.
... ...
@@ -1,5 +0,0 @@
1
-{
2
-    "name": "php-iban/php-iban",
3
-    "description": "Parse and validate IBAN (and IIBAN) bank account information",
4
-    "version": "1.4.7"
5
-}
... ...
@@ -1,55 +0,0 @@
1
-This file lists specific errors observed in the official IBAN specification.
2
-
3
-In addition to the specific errors, there persist basic outstanding
4
-matters that cause issue for implementers:
5
- - Non 1:1 mapping of records to countries (eg: French territories, etc.)
6
- - Mixing of free text and hard data in specification fields
7
- - Lack of validation of information in fields prior to publishing
8
- - Lack of synchronisation between TXT and PDF versions of the registry
9
-
10
-2011-07-16
11
-----------
12
- - No information for Kuwait past sixth column
13
- - Total absence of information regarding Kazakhstan
14
- - '1.00001E+15' instead of a valid BBAN example for Lithuania
15
- - Repeated IBAN example in human format instead of IBAN format-
16
-   specification for UAE
17
- - Incorrect domestic example for Bulgaria, Kazakhstan, Latvia,
18
-   Lithuania, Luxembourg, Macedonia, Mauritius, Romania, San Marino
19
-   (complete, human-format IBAN instead of domestic example)
20
-
21
-Early 2012
22
-----------
23
- - Inconsistent record ordering (KW, KZ)
24
- - Inconsistent capitalization (DK)
25
- - Continued presence of incorrect domestic examples
26
-
27
-February 2013
28
--------------
29
- - Deployment of unparseable special values such as "Not in use" (FI).
30
- - Still(!) missing a registry entry for 2010's 'new' entry of Khazakstan
31
-
32
-September 2013
33
---------------
34
- - Azerbaijan, Brazil, Costa Rica, Palestine, Virgin Islands 'SEPA 
35
-   Country' field in PDF (yes/no) is completely blank
36
-
37
-March 2014
38
-----------
39
- - In multiple cases, territories of a major country have a SEPA status
40
-   that differs from the parent jurisdiction. The IBAN specification as
41
-   previously released does not include individual records for these
42
-   territories, and thus cannot convey this important information.
43
- - The IBAN registry's old URL is no longer publicly available! Its now
44
-   ends in a 404, and the apparent new home, located over at
45
-   http://www.swift.com/products_services/by_type/reference_data/iban_registry_iso13616
46
-   does not have any content. The parent portion of this part of the
47
-   SWIFT website suggests the information may have been moved to a new
48
-   'SWIFTRef' site, however that site appears to only peddle paid for
49
-   directories of BICs and similar. The new location after much
50
-   searching was found to be http://www.swift.com/products_services/bic_and_iban_format_registration_iban_format_r
51
-
52
-June 2014
53
----------
54
- - The TXT registry records of QA and JO do not match those within the 
55
-   PDF and are essentially spurious while looking roughly correct. Dang.
... ...
@@ -1,63 +0,0 @@
1
-By unix tradition, this file outlines information that may be useful to
2
-people who wish to modify the php-iban project. It outlines some basic
3
-information around design decisions and other considerations.
4
-
5
- Procedural style
6
- ----------------
7
-   The code is written in PHP's original procedural style, and does
8
-   not require or assume any OO model. This is unix tradition and
9
-   should ease any integration pains due to objectspace mismatches.
10
-   In addition, it should make it easy for users both within an OO
11
-   or a procedural codebase to make use of the library. An OO wrapper
12
-   has been supplied to make things more familiar for those who are
13
-   only exposed to OO PHP: please try to keep it in synch with the
14
-   procedural (main) library where possible.
15
-
16
- Registry maintenance
17
- --------------------
18
-   The 'convert-registry.php' tool found in the 'utils/' subdirectory
19
-   is intended to assist with the automatic conversion of the SWIFT-
20
-   provided 'IBAN Registry' text files to the format required to
21
-   support php-iban execution. Why is there a new format, and why is it
22
-   distributed with php-iban instead of being generated on the fly
23
-   from SWIFT-provided data files? There are a few reasons:
24
-
25
-    - Error correction
26
-      If errors are discovered in the official specification then they
27
-      can be resolved by us. There are (or have been) known errors
28
-      with the official IBAN Registry. (See COMEDY-OF-ERRORS)
29
-
30
-    - Exclusion correction
31
-      If exclusions are discovered in the official specification then
32
-      they can be resolved by us. There are (or have been) known 
33
-      exclusions from the official IBAN Registry. (See COMEDY-OF-ERRORS)
34
-
35
-    - Efficiency
36
-      Because pattern matching is a core part of the functionality of
37
-      php-iban, and the pattern algorithms distributed by SWIFT are
38
-      (rather strangely) not in regular expression format, using their
39
-      files directly would result in a fairly significant startup
40
-      penalty as pattern conversion would be required (at each
41
-      invocation!) unless a caching strategy were deployed, which would
42
-      create additional complexity and sources of bugs (in addition,
43
-      due to the previous two points automatic conversion is not
44
-      presently possible ... and may never be!)
45
-
46
-    - Maintainability
47
-      Distribution of a modified registry along with php-iban places
48
-      the burden of registry maintenance on with the package 
49
-      maintainer(s) rather than with the user. This is better for
50
-      users who, if they really want, can still hack their local copy.
51
-
52
-   Note that due to points one and two, the 'convert-registry.php' tool
53
-   is insufficient to produce a correct 'registry.txt' file.  (You may
54
-   wish to review the differences between your newly generated file
55
-   and the original with the 'diff' tool in order to ascertain what
56
-   has changed.)
57
-
58
-   A closing point on the registry: obviously, if any new fields are
59
-   added, then it is best to append them to the end of the registry
60
-   (rightmost, new field) in order to preserve backwards compatibility
61
-   instead of re-ordering the fields which would break older installs.
62
-   (The internal '_iban_load_registry()' function re-orders these fields
63
-   at load time in order to simplify runtime debugging, anyway.)
... ...
@@ -1,165 +0,0 @@
1
-		   GNU LESSER GENERAL PUBLIC LICENSE
2
-                       Version 3, 29 June 2007
3
-
4
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
5
- Everyone is permitted to copy and distribute verbatim copies
6
- of this license document, but changing it is not allowed.
7
-
8
-
9
-  This version of the GNU Lesser General Public License incorporates
10
-the terms and conditions of version 3 of the GNU General Public
11
-License, supplemented by the additional permissions listed below.
12
-
13
-  0. Additional Definitions. 
14
-
15
-  As used herein, "this License" refers to version 3 of the GNU Lesser
16
-General Public License, and the "GNU GPL" refers to version 3 of the GNU
17
-General Public License.
18
-
19
-  "The Library" refers to a covered work governed by this License,
20
-other than an Application or a Combined Work as defined below.
21
-
22
-  An "Application" is any work that makes use of an interface provided
23
-by the Library, but which is not otherwise based on the Library.
24
-Defining a subclass of a class defined by the Library is deemed a mode
25
-of using an interface provided by the Library.
26
-
27
-  A "Combined Work" is a work produced by combining or linking an
28
-Application with the Library.  The particular version of the Library
29
-with which the Combined Work was made is also called the "Linked
30
-Version".
31
-
32
-  The "Minimal Corresponding Source" for a Combined Work means the
33
-Corresponding Source for the Combined Work, excluding any source code
34
-for portions of the Combined Work that, considered in isolation, are
35
-based on the Application, and not on the Linked Version.
36
-
37
-  The "Corresponding Application Code" for a Combined Work means the
38
-object code and/or source code for the Application, including any data
39
-and utility programs needed for reproducing the Combined Work from the
40
-Application, but excluding the System Libraries of the Combined Work.
41
-
42
-  1. Exception to Section 3 of the GNU GPL.
43
-
44
-  You may convey a covered work under sections 3 and 4 of this License
45
-without being bound by section 3 of the GNU GPL.
46
-
47
-  2. Conveying Modified Versions.
48
-
49
-  If you modify a copy of the Library, and, in your modifications, a
50
-facility refers to a function or data to be supplied by an Application
51
-that uses the facility (other than as an argument passed when the
52
-facility is invoked), then you may convey a copy of the modified
53
-version:
54
-
55
-   a) under this License, provided that you make a good faith effort to
56
-   ensure that, in the event an Application does not supply the
57
-   function or data, the facility still operates, and performs
58
-   whatever part of its purpose remains meaningful, or
59
-
60
-   b) under the GNU GPL, with none of the additional permissions of
61
-   this License applicable to that copy.
62
-
63
-  3. Object Code Incorporating Material from Library Header Files.
64
-
65
-  The object code form of an Application may incorporate material from
66
-a header file that is part of the Library.  You may convey such object
67
-code under terms of your choice, provided that, if the incorporated
68
-material is not limited to numerical parameters, data structure
69
-layouts and accessors, or small macros, inline functions and templates
70
-(ten or fewer lines in length), you do both of the following:
71
-
72
-   a) Give prominent notice with each copy of the object code that the
73
-   Library is used in it and that the Library and its use are
74
-   covered by this License.
75
-
76
-   b) Accompany the object code with a copy of the GNU GPL and this license
77
-   document.
78
-
79
-  4. Combined Works.
80
-
81
-  You may convey a Combined Work under terms of your choice that,
82
-taken together, effectively do not restrict modification of the
83
-portions of the Library contained in the Combined Work and reverse
84
-engineering for debugging such modifications, if you also do each of
85
-the following:
86
-
87
-   a) Give prominent notice with each copy of the Combined Work that
88
-   the Library is used in it and that the Library and its use are
89
-   covered by this License.
90
-
91
-   b) Accompany the Combined Work with a copy of the GNU GPL and this license
92
-   document.
93
-
94
-   c) For a Combined Work that displays copyright notices during
95
-   execution, include the copyright notice for the Library among
96
-   these notices, as well as a reference directing the user to the
97
-   copies of the GNU GPL and this license document.
98
-
99
-   d) Do one of the following:
100
-
101
-       0) Convey the Minimal Corresponding Source under the terms of this
102
-       License, and the Corresponding Application Code in a form
103
-       suitable for, and under terms that permit, the user to
104
-       recombine or relink the Application with a modified version of
105
-       the Linked Version to produce a modified Combined Work, in the
106
-       manner specified by section 6 of the GNU GPL for conveying
107
-       Corresponding Source.
108
-
109
-       1) Use a suitable shared library mechanism for linking with the
110
-       Library.  A suitable mechanism is one that (a) uses at run time
111
-       a copy of the Library already present on the user's computer
112
-       system, and (b) will operate properly with a modified version
113
-       of the Library that is interface-compatible with the Linked
114
-       Version. 
115
-
116
-   e) Provide Installation Information, but only if you would otherwise
117
-   be required to provide such information under section 6 of the
118
-   GNU GPL, and only to the extent that such information is
119
-   necessary to install and execute a modified version of the
120
-   Combined Work produced by recombining or relinking the
121
-   Application with a modified version of the Linked Version. (If
122
-   you use option 4d0, the Installation Information must accompany
123
-   the Minimal Corresponding Source and Corresponding Application
124
-   Code. If you use option 4d1, you must provide the Installation
125
-   Information in the manner specified by section 6 of the GNU GPL
126
-   for conveying Corresponding Source.)
127
-
128
-  5. Combined Libraries.
129
-
130
-  You may place library facilities that are a work based on the
131
-Library side by side in a single library together with other library
132
-facilities that are not Applications and are not covered by this
133
-License, and convey such a combined library under terms of your
134
-choice, if you do both of the following:
135
-
136
-   a) Accompany the combined library with a copy of the same work based
137
-   on the Library, uncombined with any other library facilities,
138
-   conveyed under the terms of this License.
139
-
140
-   b) Give prominent notice with the combined library that part of it
141
-   is a work based on the Library, and explaining where to find the
142
-   accompanying uncombined form of the same work.
143
-
144
-  6. Revised Versions of the GNU Lesser General Public License.
145
-
146
-  The Free Software Foundation may publish revised and/or new versions
147
-of the GNU Lesser General Public License from time to time. Such new
148
-versions will be similar in spirit to the present version, but may
149
-differ in detail to address new problems or concerns.
150
-
151
-  Each version is given a distinguishing version number. If the
152
-Library as you received it specifies that a certain numbered version
153
-of the GNU Lesser General Public License "or any later version"
154
-applies to it, you have the option of following the terms and
155
-conditions either of that published version or of any later version
156
-published by the Free Software Foundation. If the Library as you
157
-received it does not specify a version number of the GNU Lesser
158
-General Public License, you may choose any version of the GNU Lesser
159
-General Public License ever published by the Free Software Foundation.
160
-
161
-  If the Library as you received it specifies that a proxy can decide
162
-whether future versions of the GNU Lesser General Public License shall
163
-apply, that proxy's public statement of acceptance of any version is
164
-permanent authorization for you to choose that version for the
165
-Library.
... ...
@@ -1,207 +0,0 @@
1
-php-iban README
2
----------------
3
-
4
-php-iban is a library for parsing and validating International Bank
5
-Account Number (IBAN) information in PHP.
6
-
7
-It also validates Internet International Bank Account Number
8
-(IIBAN) as specified at http://tools.ietf.org/html/draft-iiban-01
9
-(see also http://www.ifex-project.org/our-proposals/iiban)
10
-
11
-php-iban lives at http://code.google.com/p/php-iban
12
-
13
-  What is an IBAN?
14
-  ----------------
15
-    An IBAN is basically a standardised way of explaining a bank
16
-    account number that works across borders.  Its structure is:
17
-
18
-     <Two Letter ISO Country Code> + <Two Digit Checksum] + <BBAN>
19
-    
20
-    BBAN is the term used to describe the national-level format
21
-    for a bank account number, which varies between countries
22
-    (and was sometimes created just to get IBAN connectivity!).
23
-    Note that a BBAN may have its own checksum algorithm.
24
-
25
-    IBAN provides basic protection, using the checksum, against
26
-    transcription (ie: human copying) errors. It also provides
27
-    a registry of valid destination countries and their BBAN
28
-    formats. Thus, when you ask php-iban to 'validate' an IBAN
29
-    it ensures that these checks are passed. However, it cannot
30
-    ensure that a bank account actually exists - the only party
31
-    who can do that is the receiving bank or country.
32
-
33
-    IBAN was invented in Europe, however its usage is growing
34
-    rapidly to other parts of the world. Thus, the future of
35
-    this library looks pretty good.
36
-
37
-    For further information, please see 'docs/ISO13616.pdf' or
38
-    visit Wikipedia at http://en.wikipedia.org/wiki/IBAN
39
-
40
-  What is an IIBAN?
41
-  -----------------
42
-   An Internet IBAN (IIBAN) identifies an internet-based financial
43
-   endpoint in a manner that is superset-compatible with the existing
44
-   European Committee for Banking Standards (ECBS) International Bank
45
-   Account Number (IBAN) standard [ISO13616].
46
-
47
-   For more information see http://tools.ietf.org/html/draft-iiban-00
48
-   and http://www.ifex-project.org/our-proposals/iiban
49
-
50
-   To disable IIBAN support from your installation, simply remove
51
-   the second ('AA|...') line from the top of the registry.txt file.
52
-
53
-  Execution environment
54
-  ---------------------
55
-    At present the library merely requires a PHP engine to be present
56
-    and has no external dependencies.  It is recommended that your
57
-    PHP engine is configured to disable verbose warnings for events
58
-    such as access of unknown array indexes, though this should be
59
-    standard on almost any PHP deployment today. Any PHP engine
60
-    in use today should be compatible, though PHP3 or PHP4 execution
61
-    environments may require minor modifications (specifically,
62
-    some string functions may have changed).
63
-
64
-  Installation
65
-  ------------
66
-    Simply copy 'php-iban.php' and 'registry.txt' to an appropriate
67
-    location for your project. The location of the files will affect
68
-    the 'require_once()' line used to load the library from your
69
-    codebase, and may have relevance security (see 'Security' below).
70
-    Note that 'php-iban.php' expects to find 'registry.txt' in the
71
-    same directory as itself.
72
-
73
-  Security
74
-  --------
75
-    Following best practice for library files, the location chosen 
76
-    for the php-iban.php and registry.txt files should ideally be 
77
-    outside of any web-accessible directories. Thus, if your 
78
-    web project lives in /var/www/myproject/htdocs/ then it would
79
-    be preferably to place php-iban in /var/www/myproject or some
80
-    other directory that is not visible to regular web users.
81
-    
82
-    Secondly, neither file should be writable by the web server
83
-    itself in order to prevent compromise of the execution path
84
-    (ie: getting hacked). So, for example if your web server runs
85
-    as user 'www', group 'www', you can ensure that the web server
86
-    has minimal required privileges against the files as follows
87
-    (note that you will need to be root to execute these commands):
88
-
89
-     # chown <myuser> php-iban registry.txt  # where <myuser> is a
90
-                                             # non-root user that
91
-                                             # is not 'www'.
92
-     # chgrp www php-iban registry.txt       # set group to 'www'
93
-     # chmod ugo-rwx php-iban registry.txt   # remove privileges
94
-     # chmod g+r php-iban registry.txt       # allow 'www' group
95
-                                             # to read the files
96
-
97
-    Obviously the above do not apply if you are using PHP in a 
98
-    non web-oriented project (eg: a cronjob or daemon), a usage
99
-    of the language that is apparently growing - but limited.
100
-
101
-  Using the library
102
-  -----------------
103
-    Basic invocation is as follows:
104
-
105
-      # include the library
106
-      require_once('/path/to/php-iban.php'); # /path/to/ is optional
107
-
108
-      # use some library function or other...
109
-      if(!verify_iban($iban_to_verify)) {
110
-       # blame the user...
111
-      }
112
-
113
-    Note that because the library is designed in a procedural manner
114
-    rather than an object-oriented manner it should be easy to 
115
-    integrate with a wide variety of established codebases and 
116
-    PHP interpreter versions.
117
-
118
-  Using the library's OO wrapper
119
-  ------------------------------
120
-    Because many new PHP programmers seems to learn the language via
121
-    books that only teach OO based programming and are thus unfamiliar
122
-    with procedural PHP (and often relatively inexperienced as 
123
-    programmers, too) an OO wrapper-library has been provided.
124
-
125
-    ======================= READ THIS =================================
126
-    However *you should avoid excessive use of OO*. For some thought
127
-    provoking discussions of the negative aspects of overusing OO,
128
-    please refer to 'Coders at Work' and 'The Art of UNIX Programming'.
129
-    (OO is great for some problems, but simply pointless for most.)
130
-    ===================================================================
131
-
132
-    Anyway, to use the OO wrapper supplied, invocation is as follows:
133
-
134
-      # include the OO wrapper to the library
135
-      require_once('/path/to/oophp-iban.php'); # /path/to is optional
136
-
137
-      # instantiate an IBAN object
138
-      $myIban = new IBAN('AZ12345678901234');
139
-      if(!$myIban->Verify()) {
140
-       # blame the user...
141
-      }
142
-
143
-  Documentation
144
-  -------------
145
-    There are three types of functions provided by the library:
146
-
147
-     - IBAN-level functions
148
-
149
-         These are functions that operate on an IBAN. All of these
150
-         functions accept either machine format or human format
151
-         IBANs as input. Typically they return facts about an IBAN
152
-         as their output (for example whether it is valid or not,
153
-         or the BBAN (national-level) portion of the IBAN), though
154
-         some of them may perform other functions (eg: fixing a
155
-         broken IBAN checksum). These functions are named 'iban_*'
156
-         with the exception of the most commonly used function,
157
-         'verify_iban()', and excepting the country-level functions.
158
-
159
-         (Regarding the object oriented wrapper - all of these
160
-          functions are implemented as methods on IBAN objects)
161
-
162
-     - IBAN country-level functions
163
-         These functions return information about countries that are
164
-         part of the IBAN standard. They each take the two letter 
165
-         ISO country code at the beginning of an IBAN as their
166
-         argument. They are named 'iban_country_*', with the 
167
-         exception of 'iban_countries()' which returns a list of
168
-         the known IBAN countries. (For example, functions that 
169
-         return an example IBAN or BBAN for the country, or the 
170
-         name of the country.)
171
-
172
-         (Regarding the object oriented wrapper - all of these
173
-          functions are implemented as methods on IBANCountry
174
-          objects, except for 'iban_countries()' which is 
175
-          implemented as the Countries() method on the IBAN class)
176
-
177
-     - Internal functions
178
-         These functions begin with '_iban_*' and can be ignored.
179
-
180
-         (Regarding the object oriented wrapper - these functions
181
-          are not present)
182
-
183
-    Please refer to either http://code.google.com/p/php-iban or the
184
-    commented source code of php-iban itself for the complete list of
185
-    which functions are available. Of course, in unix style one could
186
-    achieve the same in a pinch as follows (instant documentation!):
187
-     $ grep function php-iban.php
188
-     $ egrep '(Class|function)' oophp-iban.php
189
-
190
-  Community
191
-  ---------
192
-    You are encouraged to contribute bugs, feedback and suggestions 
193
-    through the project's website.
194
-
195
-    Particularly if you deploy php-iban in a commercial setting, you are
196
-    STRONGLY encouraged to join the project's mailing list, which can
197
-    be found via the website. Joining the mailing list ensures that you
198
-    can be made aware of important updates. Important updates include:
199
-     - Updates to new registry editions (support new countries that have
200
-       been added to the IBAN system)
201
-     - Bug fixes 
202
-     - Security updates
203
-
204
-    The email list receives almost no traffic and as a 'Google Group' is
205
-    well protected from spam, so don't worry about junk in your inbox.
206
-
207
-Thanks for choosing php-iban! You have excellent taste in software ;)
... ...
@@ -1,17 +0,0 @@
1
-To get the latest ISO13616 IBAN registry, go to:
2
- http://www.swift.com/products_services/bic_and_iban_format_registration_iban_format_r
3
-
4
-TXT format:
5
- http://www.swift.com/dsp/resources/documents/IBAN_Registry.txt
6
-
7
-PDF format:
8
- http://www.swift.com/dsp/resources/documents/IBAN_Registry.pdf
9
-
10
-Unfortunately, it has been noticed in 2011 that the official .txt file is
11
-not an accurate representation of the PDF format specification, and lacks
12
-some information. It is hoped that in future SWIFT will be more careful to
13
-publish only correct standards information.
14
-
15
-It has been noted in 2014 that this is still the case.
16
-
17
-(For more information on this subject, see the HACKING file)
... ...
@@ -1,9 +0,0 @@
1
-Interpreting the SEPA Field
2
-===========================
3
-
4
-Note that some IIBAN providers may in fact provide SEPA connectivity.
5
-
6
-Thus, implementers are reminded to consider the reported SEPA status
7
-of a country within the registry as confirming rather than negating
8
-the potential SEPA status of a potential financial institution who
9
-may be party to a proposed transaction.
... ...
@@ -1,21 +0,0 @@
1
-TODO
2
-----
3
-
4
- - Finnish record suggests position at which to pad domestic account
5
-   numbers in order to reach a BBAN / IBAN, this data could be of
6
-   some use for certain applications and would be nice to include
7
- - Addition of information regarding preferred human-level formatting
8
-   for each country's BBAN - worthwhile?
9
- - Addition of 'date effective' information for records such as BH
10
-   and the UAE that published data in advance of deployment
11
- - Support for calculating or validating any known national (sub-
12
-   BBAN-level) checksum algorithms?
13
- - URLs to national-level BBAN format specifications
14
- - Consider adding a library of localised forms and abbreviations
15
-   for account number portions, for example Austria and Germany seem
16
-   to have 'Kontonummer' (KTO) for account number, and 'Bankleitzah'
17
-   (BLZ) for bank identifier. This could assist greatly with 
18
-   deployments requiring international and/or constrained input.
19
- - Consider building a library of national-level bank or payment
20
-   institution identifier codes. This would be rather large and an
21
-   optional extension and would be in competition with SWIFTRef.
... ...
@@ -1,49 +0,0 @@
1
- ; formalities
2
- input-roman = number / letter
3
- number      = c-0 / c-1 / c-2 / c-3 / c-4 / c-5 / c-6 / c-7 / c-8 / c-9
4
- letter      = c-a / c-b / c-c / c-d / c-e / c-f / c-g / c-h / c-i / c-j
5
-                   / c-k / c-l / c-m / c-n / c-o / c-p / c-q / c-r / c-s
6
-                   / c-t / c-u / c-v / c-w / c-x / c-y / c-z
7
-
8
- ; possible sources of mistranscribed numbers
9
- c-0 = "O" / "6" / "D" / "G"
10
- c-1 = "I" / "L" / "7" / "2" / "Z"
11
- c-2 = "Z" / "7" / "P" / "E" / "1"
12
- c-3 = "8" / "B"
13
- c-4 = "G" / "U"
14
- c-5 = "S" / "7"
15
- c-6 = "0" / "O" / "8" / "G" / "C" / "B" / "D"
16
- c-7 = "J" / "I" / "1" / "L"
17
- c-8 = "B" / "3" / "6"
18
- c-9 = "G" / "Y" / "O" / "0" / "D"
19
-
20
- ; possible sources of mistranscribed letters
21
- c-a = "G" / "Q" / "O" / "0"
22
- c-b = "6" / "3" / "8" / "P" / "0" / "O"
23
- c-c = "R" / "6" / "I" / "L" / "O" / "0"
24
- c-d = "0" / "O" / "9" / "Q" / "G" / "6" / "A"
25
- c-e = "F" / "G" / "0" / "2" / "K" / "Z" / "S" / "O"
26
- c-f = "E" / "K" / "T" / "P" / "Y" / "4" / "B" / "7" / "1"
27
- c-g = "9" / "Q" / "8" / "6" / "0" / "C" / "4" / "O"
28
- c-h = "B" / "N" / "A" / "4" / "6" / "M" / "W" / "F" / "R" / "T" / "X"
29
- c-i = "1" / "L" / "7" / "J" / "2" / "T" / "Z"
30
- c-j = "I" / "7" / "2" / "9" / "1" / "U" / "T" / "Q" / "P" / "Y" / "Z"
31
-           / "L" / "S"
32
- c-k = "F" / "X" / "H" / "R" 
33
- c-l = "1" / "2" / "7" / "C" / "I" / "J" / "R" / "T" / "Y" / "Z"
34
- c-m = "H" / "8" / "E" / "3" / "N" / "V" / "W" 
35
- c-n = "H" / "R" / "C" / "2" / "4" / "M" / "O" / "P" / "K" / "T" / "Z"
36
- c-o = "0" / "6" / "9" / "A" / "D" / "G" / "C" / "E" / "B" / "N" / "P"
37
-           / "Q" / "R"
38
- c-p = "F" / "4" / "8" / "2" / "B" / "J" / "R" / "N" / "O" / "T" / "Y"
39
- c-q = "O" / "G" / "9" / "Y" / "1" / "7" / "L"
40
- c-r = "K" / "B" / "V" / "C" / "1" / "L" / "2"
41
- c-s = "5" / "6" / "9" / "B" / "G" / "Q" / "A" / "Y"
42
- c-t = "1" / "4" / "7" / "F" / "I" / "J" / "L" / "P" / "X" / "Y"
43
- c-u = "V" / "N" / "A" / "4" / "9" / "W" / "Y"
44
- c-v = "U" / "R" / "N"
45
- c-w = "M" / "N" / "U" / "V"
46
- c-x = "K" / "F" / "4" / "T" / "V" / "Y"
47
- c-y = "G" / "V" / "J" / "I" / "4" / "9" / "T" / "F" / "Q" / "1"
48
- c-z = "2" / "1" / "L" / "R" / "I" / "7" / "V" / "3" / "4"
49
-
... ...
@@ -1,157 +0,0 @@
1
-<?php
2
-
3
-# OO wrapper for 'php-iban.php'
4
-Class IBAN {
5
-
6
- function __construct($iban = '') {
7
-  require_once('php-iban.php'); # load the procedural codebase
8
-  $this->iban = $iban;
9
- }
10
-
11
- public function Verify($iban='') {
12
-  if($iban!='') { return verify_iban($iban); }
13
-  return verify_iban($this->iban);
14
-  # we could throw exceptions of various types, but why - does it really
15
-  # add anything? possibly some slightly better user feedback potential.
16
-  # however, this can be written by hand by performing individual checks
17
-  # ala the code in verify_iban() itself where required, which is likely
18
-  # almost never. for the increased complexity and
19
-  # maintenance/documentation cost, i say, therefore: no. no exceptions.
20
- }
21
-
22
- public function MistranscriptionSuggestions() {
23
-  return iban_mistranscription_suggestions($this->iban);
24
- }
25
-
26
- public function MachineFormat() {
27
-  return iban_to_machine_format($this->iban);
28
- }
29
-
30
- public function HumanFormat() {
31
-  return iban_to_human_format($this->iban);
32
- }
33
-
34
- public function Country($iban='') {
35
-  return iban_get_country_part($this->iban);
36
- }
37
-
38
- public function Checksum($iban='') {
39
-  return iban_get_checksum_part($this->iban);
40
- }
41
-
42
- public function BBAN() {
43
-  return iban_get_bban_part($this->iban);
44
- }
45
-
46
- public function VerifyChecksum() {
47
-  return iban_verify_checksum($this->iban);
48
- }
49
-
50
- public function FindChecksum() {
51
-  return iban_find_checksum($this->iban);
52
- }
53
-
54
- public function SetChecksum() {
55
-  $this->iban = iban_set_checksum($this->iban);
56
- }
57
-
58
- public function ChecksumStringReplace() {
59
-  return iban_checksum_string_replace($this->iban);
60
- }
61
-
62
- public function Parts() {
63
-  return iban_get_parts($this->iban);
64
- }
65
-
66
- public function Bank() {
67
-  return iban_get_bank_part($this->iban);
68
- }
69
-
70
- public function Branch() {
71
-  return iban_get_branch_part($this->iban);
72
- }
73
-
74
- public function Account() {
75
-  return iban_get_account_part($this->iban);
76
- }
77
-
78
- public function Countries() {
79
-  return iban_countries();
80
- }
81
-}
82
-
83
-# IBANCountry
84
-Class IBANCountry {
85
-
86
- # constructor with code
87
- function __construct($code = '') {
88
-  $this->code = $code;
89
- }
90
-
91
- public function Name() {
92
-  return iban_country_get_country_name($this->code);
93
- }
94
-
95
- public function DomesticExample() {
96
-  return iban_country_get_domestic_example($this->code);
97
- }
98
-
99
- public function BBANExample() {
100
-  return iban_country_get_bban_example($this->code);
101
- }
102
-
103
- public function BBANFormatSWIFT() {
104
-  return iban_country_get_bban_format_swift($this->code);
105
- }
106
-
107
- public function BBANFormatRegex() {
108
-  return iban_country_get_bban_format_regex($this->code);
109
- }
110
-
111
- public function BBANLength() {
112
-  return iban_country_get_bban_length($this->code);
113
- }
114
-
115
- public function IBANExample() {
116
-  return iban_country_get_iban_example($this->code);
117
- }
118
-
119
- public function IBANFormatSWIFT() {
120
-  return iban_country_get_iban_format_swift($this->code);
121
- }
122
-
123
- public function IBANFormatRegex() {
124
-  return iban_country_get_iban_format_regex($this->code);
125
- }
126
-
127
- public function IBANLength() {
128
-  return iban_country_get_iban_length($this->code);
129
- }
130
-
131
- public function BankIDStartOffset() {
132
-  return iban_country_get_bankid_start_offset($this->code);
133
- }
134
-
135
- public function BankIDStopOffset() {
136
-  return iban_country_get_bankid_stop_offset($this->code);
137
- }
138
-
139
- public function BranchIDStartOffset() {
140
-  return iban_country_get_branchid_start_offset($this->code);
141
- }
142
-
143
- public function BranchIDStopOffset() {
144
-  return iban_country_get_branchid_stop_offset($this->code);
145
- }
146
-
147
- public function RegistryEdition() {
148
-  return iban_country_get_registry_edition($this->code);
149
- }
150
-
151
- public function IsSEPA() {
152
-  return iban_country_is_sepa($this->code);
153
- }
154
-
155
-}
156
-
157
-?>
... ...
@@ -1,486 +0,0 @@
1
-<?php
2
-
3
-# PHP IBAN - http://code.google.com/p/php-iban - LGPLv3
4
-
5
-# Global flag by request
6
-$__disable_iiban_gmp_extension=false;
7
-
8
-# Verify an IBAN number.  Returns true or false.
9
-#  NOTE: Input can be printed 'IIBAN xx xx xx...' or 'IBAN xx xx xx...' or machine 'xxxxx' format.
10
-function verify_iban($iban) {
11
-
12
- # First convert to machine format.
13
- $iban = iban_to_machine_format($iban);
14
-
15
- # Get country of IBAN
16
- $country = iban_get_country_part($iban);
17
-
18
- # Test length of IBAN
19
- if(strlen($iban)!=iban_country_get_iban_length($country)) { return false; }
20
-
21
- # Get checksum of IBAN
22
- $checksum = iban_get_checksum_part($iban);
23
-
24
- # Get country-specific IBAN format regex
25
- $regex = '/'.iban_country_get_iban_format_regex($country).'/';
26
-
27
- # Check regex
28
- if(preg_match($regex,$iban)) {
29
-  # Regex passed, check checksum
30
-  if(!iban_verify_checksum($iban)) { 
31
-   return false;
32
-  }
33
- }
34
- else {
35
-  return false;
36
- }
37
-
38
- # Otherwise it 'could' exist
39
- return true;
40
-}
41
-
42
-# Convert an IBAN to machine format.  To do this, we
43
-# remove IBAN from the start, if present, and remove
44
-# non basic roman letter / digit characters
45
-function iban_to_machine_format($iban) {
46
- # Uppercase and trim spaces from left
47
- $iban = ltrim(strtoupper($iban));
48
- # Remove IIBAN or IBAN from start of string, if present
49
- $iban = preg_replace('/^I?IBAN/','',$iban);
50
- # Remove all non basic roman letter / digit characters
51
- $iban = preg_replace('/[^a-zA-Z0-9]/','',$iban);
52
- return $iban;
53
-}
54
-
55
-# Convert an IBAN to human format. To do this, we
56
-# simply insert spaces right now, as per the ECBS
57
-# (European Committee for Banking Standards) 
58
-# recommendations available at:
59
-# http://www.europeanpaymentscouncil.eu/knowledge_bank_download.cfm?file=ECBS%20standard%20implementation%20guidelines%20SIG203V3.2.pdf 
60
-function iban_to_human_format($iban) {
61
- # First verify validity, or return
62
- if(!verify_iban($iban)) { return false; }
63
- # Add spaces every four characters
64
- $human_iban = '';
65
- for($i=0;$i<strlen($iban);$i++) {
66
-  $human_iban .= substr($iban,$i,1);
67
-  if(($i>0) && (($i+1)%4==0)) { $human_iban .= ' '; }
68
- }
69
- return $human_iban;
70
-}
71
-
72
-# Get the country part from an IBAN
73
-function iban_get_country_part($iban) {
74
- $iban = iban_to_machine_format($iban);
75
- return substr($iban,0,2);
76
-}
77
-
78
-# Get the checksum part from an IBAN
79
-function iban_get_checksum_part($iban) {
80
- $iban = iban_to_machine_format($iban);
81
- return substr($iban,2,2);
82
-}
83
-
84
-# Get the BBAN part from an IBAN
85
-function iban_get_bban_part($iban) {
86
- $iban = iban_to_machine_format($iban);
87
- return substr($iban,4);
88
-}
89
-
90
-# Check the checksum of an IBAN - code modified from Validate_Finance PEAR class
91
-function iban_verify_checksum($iban) {
92
- # convert to machine format
93
- $iban = iban_to_machine_format($iban);
94
- # move first 4 chars (countrycode and checksum) to the end of the string
95
- $tempiban = substr($iban, 4).substr($iban, 0, 4);
96
- # subsitutute chars
97
- $tempiban = iban_checksum_string_replace($tempiban);
98
- # mod97-10
99
- $result = iban_mod97_10($tempiban);
100
- # checkvalue of 1 indicates correct IBAN checksum
101
- if ($result != 1) {
102
-  return false;
103
- }
104
- return true;
105
-}
106
-
107
-# Find the correct checksum for an IBAN
108
-#  $iban  The IBAN whose checksum should be calculated
109
-function iban_find_checksum($iban) {
110
- $iban = iban_to_machine_format($iban);
111
- # move first 4 chars to right
112
- $left = substr($iban,0,2) . '00'; # but set right-most 2 (checksum) to '00'
113
- $right = substr($iban,4);
114
- # glue back together
115
- $tmp = $right . $left;
116
- # convert letters using conversion table
117
- $tmp = iban_checksum_string_replace($tmp);
118
- # get mod97-10 output
119
- $checksum = iban_mod97_10_checksum($tmp);
120
- # return 98 minus the mod97-10 output, left zero padded to two digits
121
- return str_pad((98-$checksum),2,'0',STR_PAD_LEFT);
122
-}
123
-
124
-# Set the correct checksum for an IBAN
125
-#  $iban  IBAN whose checksum should be set
126
-function iban_set_checksum($iban) {
127
- $iban = iban_to_machine_format($iban);
128
- return substr($iban,0,2) . iban_find_checksum($iban) . substr($iban,4);
129
-}
130
-
131
-# Character substitution required for IBAN MOD97-10 checksum validation/generation
132
-#  $s  Input string (IBAN)
133
-function iban_checksum_string_replace($s) {
134
- $iban_replace_chars = range('A','Z');
135
- foreach (range(10,35) as $tempvalue) { $iban_replace_values[]=strval($tempvalue); }
136
- return str_replace($iban_replace_chars,$iban_replace_values,$s);
137
-}
138
-
139
-# Same as below but actually returns resulting checksum
140
-function iban_mod97_10_checksum($numeric_representation) {
141
- $checksum = intval(substr($numeric_representation, 0, 1));
142
- for ($position = 1; $position < strlen($numeric_representation); $position++) {
143
-  $checksum *= 10;
144
-  $checksum += intval(substr($numeric_representation,$position,1));
145
-  $checksum %= 97;
146
- }
147
- return $checksum;
148
-}
149
-
150
-# Perform MOD97-10 checksum calculation ('Germanic-level effiency' version - thanks Chris!)
151
-function iban_mod97_10($numeric_representation) {
152
- global $__disable_iiban_gmp_extension;
153
- # prefer php5 gmp extension if available
154
- if(!($__disable_iiban_gmp_extension) && function_exists('gmp_intval')) { return gmp_intval(gmp_mod(gmp_init($numeric_representation, 10),'97')) === 1; }
155
-
156
-/*
157
- # old manual processing (~16x slower)
158
- $checksum = intval(substr($numeric_representation, 0, 1));
159
- for ($position = 1; $position < strlen($numeric_representation); $position++) {
160
-  $checksum *= 10;
161
-  $checksum += intval(substr($numeric_representation,$position,1));
162
-  $checksum %= 97;
163
- }
164
- return $checksum;
165
- */
166
-
167
- # new manual processing (~3x slower)
168
- $length = strlen($numeric_representation);
169
- $rest = "";
170
- $position = 0;
171
- while ($position < $length) {
172
-        $value = 9-strlen($rest);
173
-        $n = $rest . substr($numeric_representation,$position,$value);
174
-        $rest = $n % 97;
175
-        $position = $position + $value;
176
- }
177
- return ($rest === 1);
178
-}
179
-
180
-# Get an array of all the parts from an IBAN
181
-function iban_get_parts($iban) {
182
- return array(
183
-         'country'	=>      iban_get_country_part($iban),
184
- 	 'checksum'	=>	iban_get_checksum_part($iban),
185
-	 'bban'		=>	iban_get_bban_part($iban),
186
- 	 'bank'		=>	iban_get_bank_part($iban),
187
-	 'country'	=>	iban_get_country_part($iban),
188
-	 'branch'	=>	iban_get_branch_part($iban),
189
-	 'account'	=>	iban_get_account_part($iban)
190
-        );
191
-}
192
-
193
-# Get the Bank ID (institution code) from an IBAN
194
-function iban_get_bank_part($iban) {
195
- $iban = iban_to_machine_format($iban);
196
- $country = iban_get_country_part($iban);
197
- $start = iban_country_get_bankid_start_offset($country);
198
- $stop = iban_country_get_bankid_stop_offset($country);
199
- if($start!=''&&$stop!='') {
200
-  $bban = iban_get_bban_part($iban);
201
-  return substr($bban,$start,($stop-$start+1));
202
- }
203
- return '';
204
-}
205
-
206
-# Get the Branch ID (sort code) from an IBAN
207
-function iban_get_branch_part($iban) {
208
- $iban = iban_to_machine_format($iban);
209
- $country = iban_get_country_part($iban);
210
- $start = iban_country_get_branchid_start_offset($country);
211
- $stop = iban_country_get_branchid_stop_offset($country);
212
- if($start!=''&&$stop!='') {
213
-  $bban = iban_get_bban_part($iban);
214
-  return substr($bban,$start,($stop-$start+1));
215
- }
216
- return '';
217
-}
218
-
219
-# Get the (branch-local) account ID from an IBAN
220
-function iban_get_account_part($iban) {
221
- $iban = iban_to_machine_format($iban);
222
- $country = iban_get_country_part($iban);
223
- $start = iban_country_get_branchid_stop_offset($country);
224
- if($start=='') {
225
-  $start = iban_country_get_bankid_stop_offset($country);
226
- }
227
- if($start!='') {
228
-  $bban = iban_get_bban_part($iban);
229
-  return substr($bban,$start+1);
230
- }
231
- return '';
232
-}
233
-
234
-# Get the name of an IBAN country
235
-function iban_country_get_country_name($iban_country) {
236
- return _iban_country_get_info($iban_country,'country_name');
237
-}
238
-
239
-# Get the domestic example for an IBAN country
240
-function iban_country_get_domestic_example($iban_country) {
241
- return _iban_country_get_info($iban_country,'domestic_example');
242
-}
243
-
244
-# Get the BBAN example for an IBAN country
245
-function iban_country_get_bban_example($iban_country) {
246
- return _iban_country_get_info($iban_country,'bban_example');
247
-}
248
-
249
-# Get the BBAN format (in SWIFT format) for an IBAN country
250
-function iban_country_get_bban_format_swift($iban_country) {
251
- return _iban_country_get_info($iban_country,'bban_format_swift');
252
-}
253
-
254
-# Get the BBAN format (as a regular expression) for an IBAN country
255
-function iban_country_get_bban_format_regex($iban_country) {
256
- return _iban_country_get_info($iban_country,'bban_format_regex');
257
-}
258
-
259
-# Get the BBAN length for an IBAN country
260
-function iban_country_get_bban_length($iban_country) {
261
- return _iban_country_get_info($iban_country,'bban_length');
262
-}
263
-
264
-# Get the IBAN example for an IBAN country
265
-function iban_country_get_iban_example($iban_country) {
266
- return _iban_country_get_info($iban_country,'iban_example');
267
-}
268
-
269
-# Get the IBAN format (in SWIFT format) for an IBAN country
270
-function iban_country_get_iban_format_swift($iban_country) {
271
- return _iban_country_get_info($iban_country,'iban_format_swift');
272
-}
273
-
274
-# Get the IBAN format (as a regular expression) for an IBAN country
275
-function iban_country_get_iban_format_regex($iban_country) {
276
- return _iban_country_get_info($iban_country,'iban_format_regex');
277
-}
278
-
279
-# Get the IBAN length for an IBAN country
280
-function iban_country_get_iban_length($iban_country) {
281
- return _iban_country_get_info($iban_country,'iban_length');
282
-}
283
-
284
-# Get the BBAN Bank ID start offset for an IBAN country
285
-function iban_country_get_bankid_start_offset($iban_country) {
286
- return _iban_country_get_info($iban_country,'bban_bankid_start_offset');
287
-}
288
-
289
-# Get the BBAN Bank ID stop offset for an IBAN country
290
-function iban_country_get_bankid_stop_offset($iban_country) {
291
- return _iban_country_get_info($iban_country,'bban_bankid_stop_offset');
292
-}
293
-
294
-# Get the BBAN Branch ID start offset for an IBAN country
295
-function iban_country_get_branchid_start_offset($iban_country) {
296
- return _iban_country_get_info($iban_country,'bban_branchid_start_offset');
297
-}
298
-
299
-# Get the BBAN Branch ID stop offset for an IBAN country
300
-function iban_country_get_branchid_stop_offset($iban_country) {
301
- return _iban_country_get_info($iban_country,'bban_branchid_stop_offset');
302
-}
303
-
304
-# Get the registry edition for an IBAN country
305
-function iban_country_get_registry_edition($iban_country) {
306
- return _iban_country_get_info($iban_country,'registry_edition');
307
-}
308
-
309
-# Is the IBAN country a SEPA member?
310
-function iban_country_is_sepa($iban_country) {
311
- return _iban_country_get_info($iban_country,'country_sepa');
312
-}
313
-
314
-# Get the list of all IBAN countries
315
-function iban_countries() {
316
- global $_iban_registry;
317
- return array_keys($_iban_registry);
318
-}
319
-
320
-# Given an incorrect IBAN, return an array of zero or more checksum-valid
321
-# suggestions for what the user might have meant, based upon common
322
-# mistranscriptions.
323
-function iban_mistranscription_suggestions($incorrect_iban) {
324
- 
325
- # abort on ridiculous length input (but be liberal)
326
- $length = strlen($incorrect_iban);
327
- if($length<5 || $length>34) { return array('(length bad)'); }
328
-
329
- # abort if mistranscriptions data is unable to load
330
- if(!_iban_load_mistranscriptions()) { return array('(failed to load)'); }
331
-
332
- # init
333
- global $_iban_mistranscriptions;
334
- $suggestions = array();
335
-
336
- # we have a string of approximately IBAN-like length.
337
- # ... now let's make suggestions.
338
- $numbers = array('0','1','2','3','4','5','6','7','8','9');
339
- for($i=0;$i<$length;$i++) {
340
-  # get the character at this position
341
-  $character = substr($incorrect_iban,$i,1);
342
-  # for each known transcription error resulting in this character
343
-  foreach($_iban_mistranscriptions[$character] as $possible_origin) {
344
-   # if we're:
345
-   #  - in the first 2 characters (country) and the possible replacement
346
-   #    is a letter
347
-   #  - in the 3rd or 4th characters (checksum) and the possible
348
-   #    replacement is a number
349
-   #  - later in the string
350
-   if(($i<2 && !in_array($possible_origin,$numbers)) ||
351
-      ($i>=2 && $i<=3 && in_array($possible_origin,$numbers)) ||
352
-      $i>3) {
353
-    # construct a possible IBAN using this possible origin for the
354
-    # mistranscribed character, replaced at this position only
355
-    $possible_iban = substr($incorrect_iban,0,$i) . $possible_origin .  substr($incorrect_iban,$i+1);
356
-    # if the checksum passes, return it as a possibility
357
-    if(verify_iban($possible_iban)) {
358
-     array_push($suggestions,$possible_iban);
359
-    }
360
-   }
361
-  }
362
- }
363
-
364
- # now we check for the type of mistransposition case where all of
365
- # the characters of a certain type within a string were mistransposed.
366
- #  - first generate a character frequency table
367
- $char_freqs = array();
368
- for($i=0;$i<strlen($incorrect_iban);$i++) {
369
-  if(!isset($char_freqs[substr($incorrect_iban,$i,1)])) {
370
-   $char_freqs[substr($incorrect_iban,$i,1)] = 1;
371
-  }
372
-  else {
373
-   $char_freqs[substr($incorrect_iban,$i,1)]++;
374
-  }
375
- }
376
- #  - now, for each of the characters in the string...
377
- foreach($char_freqs as $char=>$freq) {
378
-  # if the character occurs more than once
379
-  if($freq>1) {
380
-   # check the 'all occurrences of <char> were mistranscribed' case
381
-   foreach($_iban_mistranscriptions[$char] as $possible_origin) {
382
-    $possible_iban = str_replace($char,$possible_origin,$incorrect_iban);
383
-    if(verify_iban($possible_iban)) {
384
-     array_push($suggestions,$possible_iban);
385
-    }
386
-   }
387
-  }
388
- }
389
-
390
- return $suggestions;
391
-}
392
-
393
-
394
-##### internal use functions - safe to ignore ######
395
-
396
-# Load the IBAN registry from disk.
397
-global $_iban_registry;
398
-$_iban_registry = array();
399
-_iban_load_registry();
400
-function _iban_load_registry() {
401
- global $_iban_registry;
402
- # if the registry is not yet loaded, or has been corrupted, reload
403
- if(!is_array($_iban_registry) || count($_iban_registry)<1) {
404
-  $data = file_get_contents(dirname(__FILE__) . '/registry.txt');
405
-  $lines = explode("\n",$data);
406
-  array_shift($lines); # drop leading description line
407
-  # loop through lines
408
-  foreach($lines as $line) {
409
-   if($line!='') {
410
-    # split to fields
411
-    $old_display_errors_value = ini_get('display_errors');
412
-    ini_set('display_errors',false);
413
-    $old_error_reporting_value = ini_get('error_reporting');
414
-    ini_set('error_reporting',false);
415
-    list($country,$country_name,$domestic_example,$bban_example,$bban_format_swift,$bban_format_regex,$bban_length,$iban_example,$iban_format_swift,$iban_format_regex,$iban_length,$bban_bankid_start_offset,$bban_bankid_stop_offset,$bban_branchid_start_offset,$bban_branchid_stop_offset,$registry_edition,$country_sepa) = explode('|',$line);
416
-    ini_set('display_errors',$old_display_errors_value);
417
-    ini_set('error_reporting',$old_error_reporting_value);
418
-    # assign to registry
419
-    $_iban_registry[$country] = array(
420
-                                'country'			=>	$country,
421
- 				'country_name'			=>	$country_name,
422
-				'country_sepa'			=>	$country_sepa,
423
- 				'domestic_example'		=>	$domestic_example,
424
-				'bban_example'			=>	$bban_example,
425
-				'bban_format_swift'		=>	$bban_format_swift,
426
-				'bban_format_regex'		=>	$bban_format_regex,
427
-				'bban_length'			=>	$bban_length,
428
-				'iban_example'			=>	$iban_example,
429
-				'iban_format_swift'		=>	$iban_format_swift,
430
-				'iban_format_regex'		=>	$iban_format_regex,
431
-				'iban_length'			=>	$iban_length,
432
-				'bban_bankid_start_offset'	=>	$bban_bankid_start_offset,
433
-				'bban_bankid_stop_offset'	=>	$bban_bankid_stop_offset,
434
-				'bban_branchid_start_offset'	=>	$bban_branchid_start_offset,
435
-				'bban_branchid_stop_offset'	=>	$bban_branchid_stop_offset,
436
-				'registry_edition'		=>	$registry_edition
437
-                               );
438
-   }
439
-  }
440
- }
441
-}
442
-
443
-# Get information from the IBAN registry by example IBAN / code combination
444
-function _iban_get_info($iban,$code) {
445
- $country = iban_get_country_part($iban);
446
- return _iban_country_get_info($country,$code);
447
-}
448
-
449
-# Get information from the IBAN registry by country / code combination
450
-function _iban_country_get_info($country,$code) {
451
- global $_iban_registry;
452
- $country = strtoupper($country);
453
- $code = strtolower($code);
454
- if(array_key_exists($country,$_iban_registry)) {
455
-  if(array_key_exists($code,$_iban_registry[$country])) {
456
-   return $_iban_registry[$country][$code];
457
-  }
458
- }
459
- return false;
460
-}
461
-
462
-# Load common mistranscriptions from disk.
463
-function _iban_load_mistranscriptions() {
464
- global $_iban_mistranscriptions;
465
- # do not reload if already present
466
- if(is_array($_iban_mistranscriptions) && count($_iban_mistranscriptions) == 36) { return true; }
467
- $_iban_mistranscriptions = array();
468
- $file = dirname(__FILE__) . '/mistranscriptions.txt';
469
- if(!file_exists($file) || !is_readable($file)) { return false; }
470
- $data = file_get_contents($file);
471
- $lines = explode("\n",$data);
472
- foreach($lines as $line) {
473
-  # match lines with ' c-<x> = <something>' where x is a word-like character
474
-  if(preg_match('/^ *c-(\w) = (.*?)$/',$line,$matches)) {
475
-   # normalize the character to upper case
476
-   $character = strtoupper($matches[1]);
477
-   # break the possible origins list at '/', strip quotes & spaces
478
-   $chars = explode(' ',str_replace('"','',preg_replace('/ *?\/ *?/','',$matches[2])));
479
-   # assign as possible mistranscriptions for that character
480
-   $_iban_mistranscriptions[$character] = $chars;
481
-  }
482
- }
483
- return true;
484
-}
485
-
486
-?>
... ...
@@ -1,81 +0,0 @@
1
-country_code|country_name|domestic_example|bban_example|bban_format_swift|bban_format_regex|bban_length|iban_example|iban_format_swift|iban_format_regex|iban_length|bban_bankid_start_offset|bban_bankid_stop_offset|bban_branchid_start_offset|bban_branchid_stop_offset|registry_edition|country_sepa
2
-AA|IIBAN (Internet)|0011123Z5678|0011123Z5678|12!a|^[A-Z0-9]{12}$|12|AA120011123Z5678|AA2!n12!a|^AA(\d{2})([A-Z0-9]{12})$|16|0|3|||N/A|0
3
-AL|Albania|0000000235698741|212110090000000235698741|8!n16!c|^(\d{8})([A-Za-z0-9]{16})$|24|AL47212110090000000235698741|AL2!n8!n16!c|^AL(\d{2})(\d{8})([A-Za-z0-9]{16})$|28|0|2|3|6|2011-06-20|0
4
-AD|Andorra|2030200359100100|00012030200359100100|4!n4!n12!c|^(\d{4})(\d{4})([A-Za-z0-9]{12})$|20|AD1200012030200359100100|AD2!n4!n4!n12!c|^AD(\d{2})(\d{4})(\d{4})([A-Za-z0-9]{12})$|24|0|3|4|7|2011-06-20|0
5
-AT|Austria|19043-234573201|1904300234573201|5!n11!n|^(\d{5})(\d{11})$|16|AT611904300234573201|AT2!n5!n11!n|^AT(\d{2})(\d{5})(\d{11})$|20|0|4|||2011-06-20|1
6
-AX|Aland Islands|123456-785|12345600000785|6!n7!n1!n|^(\d{6})(\d{7})(\d{1})$|14|AX2112345600000785|AX2!n6!n7!n1!n|^AX(\d{2})(\d{6})(\d{7})(\d{1})$|18|0|2|||2013-09-05|1
7
-AZ|Azerbaijan|NABZ00000000137010001944|NABZ00000000137010001944|4!a20!c|^([A-Z]{4})([A-Za-z0-9]{20})$|24|AZ21NABZ00000000137010001944|AZ2!n4!a20!c|^AZ(\d{2})([A-Z]{4})([A-Za-z0-9]{20})$|28|0|3|||2012-05-29|0
8
-BH|Bahrain|00001299123456|BMAG00001299123456|4!a14!c|^([A-Z]{4})([A-Za-z0-9]{14})$|22|BH67BMAG00001299123456|BH2!n4!a14!c|^BH(\d{2})([A-Z]{4})([A-Za-z0-9]{14})$|22|0|3|||2012-05-29|0
9
-BE|Belgium|539-0075470-34|539007547034|3!n7!n2!n|^(\d{3})(\d{7})(\d{2})$|12|BE68539007547034|BE2!n3!n7!n2!n|^BE(\d{2})(\d{3})(\d{7})(\d{2})$|16|0|2|||2011-06-20|1
10
-BA|Bosnia and Herzegovina|199-044-00012002-79|1990440001200279|3!n3!n8!n2!n|^(\d{3})(\d{3})(\d{8})(\d{2})$|16|BA391290079401028494|BA2!n3!n3!n8!n2!n|^BA(\d{2})(\d{3})(\d{3})(\d{8})(\d{2})$|20|0|2|3|5|2011-06-20|0
11
-BR|Brazil|0009795493C1|00360305000010009795493P1|8!n5!n10!n1!a1!c|^(\d{8})(\d{5})(\d{10})([A-Z]{1})([A-Za-z0-9]{1})$|25|BR2300360305000010009795493P1BR1800000000141455123924100C2|BR2!n8!n5!n10!n1!a1!c|^BR(\d{2})(\d{8})(\d{5})(\d{10})([A-Z]{1})([A-Za-z0-9]{1})$|29|0|7|8|12|2013-06-20|0
12
-BG|Bulgaria|BNBG 9661 1020 3456 78|BNBG96611020345678|4!a4!n2!n8!c|^([A-Z]{4})(\d{4})(\d{2})([A-Za-z0-9]{8})$|18|BG80BNBG96611020345678|BG2!n4!a4!n2!n8!c|^BG(\d{2})([A-Z]{4})(\d{4})(\d{2})([A-Za-z0-9]{8})$|22|0|3|4|7|2011-06-20|1
13
-CR|Costa Rica|1026284066|15202001026284066|3!n14!n|^(\d{3})(\d{14})$|7|CR91202001026284066|CR2!n3!n14!n|^CR(\d{2})(\d{3})(\d{14})$|21|0|2|||2012-05-29|0
14
-HR|Croatia|1001005-1863000160|10010051863000160|7!n10!n|^(\d{7})(\d{10})$|17|HR1210010051863000160|HR2!n7!n10!n|^HR(\d{2})(\d{7})(\d{10})$|21|0|6|||2011-06-20|1
15
-CY|Cyprus|1200527600|002001280000001200527600|3!n5!n16!c|^(\d{3})(\d{5})([A-Za-z0-9]{16})$|24|CY17002001280000001200527600|CY2!n3!n5!n16!c|^CY(\d{2})(\d{3})(\d{5})([A-Za-z0-9]{16})$|28|0|2|3|7|2011-06-20|1
16
-CZ|Czech Republic|19-2000145399/0800|08000000192000145399|4!n6!n10!n|^(\d{4})(\d{6})(\d{10})$|20|CZ6508000000192000145399|CZ2!n4!n6!n10!n|^CZ(\d{2})(\d{4})(\d{6})(\d{10})$|24|0|3|4|9|2011-06-20|1
17
-DK|Denmark|0040 0440116243, 6460 0001631634, 6471 0001000206|00400440116243, 64600001631634, 64710001000206|4!n9!n1!n|^(\d{4})(\d{9})(\d{1})$|14|DK5000400440116243|DK2!n4!n9!n1!n|^DK(\d{2})(\d{4})(\d{9})(\d{1})$|18|0|3|||2011-06-20|1
18
-FO|Faroe Islands|0040 0440116243, 6460 0001631634, 6471 0001000206|00400440116243, 64600001631634, 64710001000206|4!n9!n1!n|^(\d{4})(\d{9})(\d{1})$|14|FO2000400440116243|FO2!n4!n9!n1!n|^FO(\d{2})(\d{4})(\d{9})(\d{1})$|18|0|3|||2011-06-20|0
19
-GL|Greenland|0040 0440116243, 6460 0001631634, 6471 0001000206|00400440116243, 64600001631634, 64710001000206|4!n9!n1!n|^(\d{4})(\d{9})(\d{1})$|14|GL2000400440116243|GL2!n4!n9!n1!n|^GL(\d{2})(\d{4})(\d{9})(\d{1})$|18|0|3|||2011-06-20|0
20
-DO|Dominican Republic|1212453611324|AGR00000001212453611324|4!c20!n|^([A-Za-z0-9]{4})(\d{20})$|24|DO28BAGR00000001212453611324|DO2!n4!c20!n|^DO(\d{2})([A-Za-z0-9]{4})(\d{20})$|28|0|3|||2011-06-20|0
21
-EE|Estonia|221020145685|2200221020145685|2!n2!n11!n1!n|^(\d{2})(\d{2})(\d{11})(\d{1})$|16|EE382200221020145685|EE2!n2!n2!n11!n1!n|^EE(\d{2})(\d{2})(\d{2})(\d{11})(\d{1})$|20|0|1|||2011-06-20|1
22
-FI|Finland|123456-785|12345600000785|6!n7!n1!n|^(\d{6})(\d{7})(\d{1})$|14|FI2112345600000785|FI2!n6!n7!n1!n|^FI(\d{2})(\d{6})(\d{7})(\d{1})$|18|0|2|||2013-08-05|1
23
-FR|France|20041 01005 0500013M026 06|20041010050500013M02606|5!n5!n11!c2!n|^(\d{5})(\d{5})([A-Za-z0-9]{11})(\d{2})$|23|FR1420041010050500013M02606|FR2!n5!n5!n11!c2!n|^FR(\d{2})(\d{5})(\d{5})([A-Za-z0-9]{11})(\d{2})$|27|0|4|5|9|2013-08-28|1
24
-BL|Saint Barthelemy|20041 01005 0500013M026 06|20041010050500013M02606|5!n5!n11!c2!n|^(\d{5})(\d{5})([A-Za-z0-9]{11})(\d{2})$|23|BL9820041010050500013M02606|BL2!n5!n5!n11!c2!n|^BL(\d{2})(\d{5})(\d{5})([A-Za-z0-9]{11})(\d{2})$|27|0|4|5|9|2013-02-08|0
25
-GF|French Guyana|20041 01005 0500013M026 06|20041010050500013M02606|5!n5!n11!c2!n|^(\d{5})(\d{5})([A-Za-z0-9]{11})(\d{2})$|23|GF4120041010050500013M02606|GF2!n5!n5!n11!c2!n|^GF(\d{2})(\d{5})(\d{5})([A-Za-z0-9]{11})(\d{2})$|27|0|4|5|9|2013-08-28|1
26
-GP|Guadelope|20041 01005 0500013M026 06|20041010050500013M02606|5!n5!n11!c2!n|^(\d{5})(\d{5})([A-Za-z0-9]{11})(\d{2})$|23|GP1120041010050500013M02606|GP2!n5!n5!n11!c2!n|^GP(\d{2})(\d{5})(\d{5})([A-Za-z0-9]{11})(\d{2})$|27|0|4|5|9|2013-08-28|1
27
-MF|Saint Martin (French Part)|20041 01005 0500013M026 06|20041010050500013M02606|5!n5!n11!c2!n|^(\d{5})(\d{5})([A-Za-z0-9]{11})(\d{2})$|23|MF9820041010050500013M02606|MF2!n5!n5!n11!c2!n|^MF(\d{2})(\d{5})(\d{5})([A-Za-z0-9]{11})(\d{2})$|27|0|4|5|9|2013-02-08|0
28
-MQ|Martinique|20041 01005 0500013M026 06|20041010050500013M02606|5!n5!n11!c2!n|^(\d{5})(\d{5})([A-Za-z0-9]{11})(\d{2})$|23|MQ5120041010050500013M02606|MQ2!n5!n5!n11!c2!n|^MQ(\d{2})(\d{5})(\d{5})([A-Za-z0-9]{11})(\d{2})$|27|0|4|5|9|2013-08-28|1
29
-RE|Reunion|20041 01005 0500013M026 06|20041010050500013M02606|5!n5!n11!c2!n|^(\d{5})(\d{5})([A-Za-z0-9]{11})(\d{2})$|23|RE4220041010050500013M02606|RE2!n5!n5!n11!c2!n|^RE(\d{2})(\d{5})(\d{5})([A-Za-z0-9]{11})(\d{2})$|27|0|4|5|9|2013-08-28|1
30
-PF|French Polynesia|20041 01005 0500013M026 06|20041010050500013M02606|5!n5!n11!c2!n|^(\d{5})(\d{5})([A-Za-z0-9]{11})(\d{2})$|23|PF5720041010050500013M02606|PF2!n5!n5!n11!c2!n|^PF(\d{2})(\d{5})(\d{5})([A-Za-z0-9]{11})(\d{2})$|27|0|4|5|9|2011-06-20|0
31
-TF|French Southern Territories|20041 01005 0500013M026 06|20041010050500013M02606|5!n5!n11!c2!n|^(\d{5})(\d{5})([A-Za-z0-9]{11})(\d{2})$|23|TF2120041010050500013M02606|TF2!n5!n5!n11!c2!n|^TF(\d{2})(\d{5})(\d{5})([A-Za-z0-9]{11})(\d{2})$|27|0|4|5|9|2011-06-20|0
32
-YT|Mayotte|20041 01005 0500013M026 06|20041010050500013M02606|5!n5!n11!c2!n|^(\d{5})(\d{5})([A-Za-z0-9]{11})(\d{2})$|23|YT3120041010050500013M02606|YT2!n5!n5!n11!c2!n|^YT(\d{2})(\d{5})(\d{5})([A-Za-z0-9]{11})(\d{2})$|27|0|4|5|9|2013-08-28|1
33
-NC|New Caledonia|20041 01005 0500013M026 06|20041010050500013M02606|5!n5!n11!c2!n|^(\d{5})(\d{5})([A-Za-z0-9]{11})(\d{2})$|23|NC8420041010050500013M02606|NC2!n5!n5!n11!c2!n|^NC(\d{2})(\d{5})(\d{5})([A-Za-z0-9]{11})(\d{2})$|27|0|4|5|9|2011-06-20|0
34
-PM|Saint Pierre et Miquelon|20041 01005 0500013M026 06|20041010050500013M02606|5!n5!n11!c2!n|^(\d{5})(\d{5})([A-Za-z0-9]{11})(\d{2})$|23|PM3620041010050500013M02606|PM2!n5!n5!n11!c2!n|^PM(\d{2})(\d{5})(\d{5})([A-Za-z0-9]{11})(\d{2})$|27|0|4|5|9|2013-08-28|1
35
-WF|Wallis and Futuna Islands|20041 01005 0500013M026 06|20041010050500013M02606|5!n5!n11!c2!n|^(\d{5})(\d{5})([A-Za-z0-9]{11})(\d{2})$|23|WF9120041010050500013M02606|WF2!n5!n5!n11!c2!n|^WF(\d{2})(\d{5})(\d{5})([A-Za-z0-9]{11})(\d{2})$|27|0|4|5|9|2011-06-20|0
36
-GE|Georgia|0000000101904917|NB0000000101904917|2!a16!n|^([A-Z]{2})(\d{16})$|18|GE29NB0000000101904917|GE2!n2!a16!n|^GE(\d{2})([A-Z]{2})(\d{16})$|22|0|1|||2011-06-20|0
37
-DE|Germany|37040044-532013000|370400440532013000|8!n10!n|^(\d{8})(\d{10})$|18|DE89370400440532013000|DE2!n8!n10!n|^DE(\d{2})(\d{8})(\d{10})$|22|0|7|||2011-06-20|1
38
-GI|Gibraltar|0000 00007099 453|NWBK000000007099453|4!a15!c|^([A-Z]{4})([A-Za-z0-9]{15})$|19|GI75NWBK000000007099453|GI2!n4!a15!c|^GI(\d{2})([A-Z]{4})([A-Za-z0-9]{15})$|23|0|3|||2011-06-20|1
39
-GR|Greece|01250000000012300695|01101250000000012300695|3!n4!n16!c|^(\d{3})(\d{4})([A-Za-z0-9]{16})$|23|GR1601101250000000012300695|GR2!n3!n4!n16!c|^GR(\d{2})(\d{3})(\d{4})([A-Za-z0-9]{16})$|27|0|2|3|6|2011-06-20|1
40
-GT|Guatemala|01020000001210029690|TRAJ01020000001210029690|4!c20!c|^([A-Za-z0-9]{4})([A-Za-z0-9]{20})$|24|GT82TRAJ01020000001210029690|GT2!n4!c20!c|^GT(\d{2})([A-Za-z0-9]{4})([A-Za-z0-9]{20})$|28|0|3|||2012-05-29|0
41
-HU|Hungary|11773016-11111018-00000000|117730161111101800000000|3!n4!n1!n15!n1!n|^(\d{3})(\d{4})(\d{1})(\d{15})(\d{1})$|24|HU42117730161111101800000000|HU2!n3!n4!n1!n15!n1!n|^HU(\d{2})(\d{3})(\d{4})(\d{1})(\d{15})(\d{1})$|28|0|2|3|6|2011-06-20|1
42
-IS|Iceland|0159-26-007654-551073-0339|0159260076545510730339|4!n2!n6!n10!n|^(\d{4})(\d{2})(\d{6})(\d{10})$|22|IS140159260076545510730339|IS2!n4!n2!n6!n10!n|^IS(\d{2})(\d{4})(\d{2})(\d{6})(\d{10})$|26|0|3|6|11|2011-06-20|1
43
-IE|Ireland|93-11-52 12345678|AIBK93115212345678|4!a6!n8!n|^([A-Z]{4})(\d{6})(\d{8})$|18|IE29AIBK93115212345678|IE2!n4!a6!n8!n|^IE(\d{2})([A-Z]{4})(\d{6})(\d{8})$|22|0|3|4|9|2011-06-20|1
44
-IL|Israel|10-800-99999999|100800000099999000|3!n3!n13!n|^(\d{3})(\d{3})(\d{13})$|19|IL620108000000099999999|IL2!n3!n3!n13!n|^IL(\d{2})(\d{3})(\d{3})(\d{13})$|23|0|2|3|5|2011-06-20|0
45
-IT|Italy|X 05428 11101 000000123456|X0542811101000000123456|1!a5!n5!n12!c|^([A-Z]{1})(\d{5})(\d{5})([A-Za-z0-9]{12})$|23|IT60X0542811101000000123456|IT2!n1!a5!n5!n12!c|^IT(\d{2})([A-Z]{1})(\d{5})(\d{5})([A-Za-z0-9]{12})$|27|0|5|6|10|2011-06-20|1
46
-JO|Jordan|1310000302|CBJO0010000000000131000302|4!a4!n18!c|^([A-Z]{4})(\d{4})([A-Za-z0-9]{18})$|26|JO94CBJO0010000000000131000302|JO2!n4!a4!n18!c|^JO(\d{2})([A-Z]{4})(\d{4})([A-Za-z0-9]{18})$|30|0|3|4|7|2014-06-05|0
47
-KZ|Kazakhstan|KZ86 125K ZT50 0410 0100|125KZT5004100100|3!n13!c|^(\d{3})([A-Za-z0-9]{13})$|16|KZ07|KZ2!n3!n13!c|^KZ(\d{2})(\d{3})([A-Za-z0-9]{13})$||0|2|||2014-06-05|0
48
-KW|Kuwait|CBKU0000000000001234560101|CBKU0000000000001234560101|4!a22!c|^([A-Z]{4})([A-Za-z0-9]{22})$|26|KW81CBKU0000000000001234560101|KW2!n4!a22!n|^KW(\d{2})([A-Z]{4})(\d{22})$|30|0|3|||2011-06-20|0
49
-LV|Latvia|BANK 0000 4351 9500 1|BANK0000435195001|4!a13!c|^([A-Z]{4})([A-Za-z0-9]{13})$|17|LV80BANK0000435195001|LV2!n4!a13!c|^LV(\d{2})([A-Z]{4})([A-Za-z0-9]{13})$|21|0|3|||2011-06-20|1
50
-LB|Lebanon|01 001 901229114|0999 0000 0001 0019 0122 9114|4!n20!c|^(\d{4})([A-Za-z0-9]{20})$|24|LB62099900000001001901229114|LB2!n4!n20!c|^LB(\d{2})(\d{4})([A-Za-z0-9]{20})$|28|0|3|||2011-06-20|0
51
-LI|Liechtenstein|8810 2324013AA|088100002324013AA|5!n12!c|^(\d{5})([A-Za-z0-9]{12})$|19|LI21088100002324013AA|LI2!n5!n12!c|^LI(\d{2})(\d{5})([A-Za-z0-9]{12})$|21|0|4|||2012-05-29|1
52
-LT|Lithuania|1000 0111 0100 1000|10000011101001000|5!n11!n|^(\d{5})(\d{11})$|16|LT121000011101001000|LT2!n5!n11!n|^LT(\d{2})(\d{5})(\d{11})$|20|0|4|||2011-06-20|1
53
-LU|Luxembourg|0019 4006 4475 0000|0019400644750000|3!n13!c|^(\d{3})([A-Za-z0-9]{13})$|16|LU280019400644750000|LU2!n3!n13!c|^LU(\d{2})(\d{3})([A-Za-z0-9]{13})$|20|0|2|||2011-06-20|1
54
-MK|Macedonia|300 0000000424 25|250120000058984|3!n10!c2!n|^(\d{3})([A-Za-z0-9]{10})(\d{2})$|15|MK07250120000058984|MK2!n3!n10!c2!n|^MK(\d{2})(\d{3})([A-Za-z0-9]{10})(\d{2})$|19|0|2|||2012-05-29|0
55
-MT|Malta|12345MTLCAST001S|MALT011000012345MTLCAST001S|4!a5!n18!c|^([A-Z]{4})(\d{5})([A-Za-z0-9]{18})$|27|MT84MALT011000012345MTLCAST001S|MT2!n4!a5!n18!c|^MT(\d{2})([A-Z]{4})(\d{5})([A-Za-z0-9]{18})$|31|0|3|4|8|2011-06-20|1
56
-MR|Mauritania|00020 00101 00001234567 53|00020001010000123456753|5!n5!n11!n2!n|^(\d{5})(\d{5})(\d{11})(\d{2})$|23|MR1300020001010000123456753|MR135!n5!n11!n2!n|^MR13(\d{5})(\d{5})(\d{11})(\d{2})$|27|0|4|5|9|2011-06-20|0
57
-MU|Mauritius|BOMM 0101 1010 3030 0200 000M UR|BOMM0101101030300200000MUR|4!a2!n2!n12!n3!n3!a|^([A-Z]{4})(\d{2})(\d{2})(\d{12})(\d{3})([A-Z]{3})$|26|MU17BOMM0101101030300200000MUR|MU2!n4!a2!n2!n12!n3!n3!a|^MU(\d{2})([A-Z]{4})(\d{2})(\d{2})(\d{12})(\d{3})([A-Z]{3})$|30|0|5|6|7|2011-06-20|0
58
-MD|Moldova|00225100013104168|AG000225100013104168|2!c18!c|^([A-Za-z0-9]{2})([A-Za-z0-9]{18})$|20|MD24AG000225100013104168|MD2!n20!c|^MD(\d{2})([A-Za-z0-9]{20})$|24|0|1|||2012-09-09|0
59
-MC|Monaco|0011111000h|11222 00001 01234567890 30|5!n5!n11!c2!n|^(\d{5})(\d{5})([A-Za-z0-9]{11})(\d{2})$|23|MC5811222000010123456789030|MC2!n5!n5!n11!c2!n|^MC(\d{2})(\d{5})(\d{5})([A-Za-z0-9]{11})(\d{2})$|27|0|4|5|9|2011-06-20|1
60
-ME|Montenegro|505 0000123456789 51|505000012345678951|3!n13!n2!n|^(\d{3})(\d{13})(\d{2})$|18|ME25505000012345678951|ME2!n3!n13!n2!n|^ME(\d{2})(\d{3})(\d{13})(\d{2})$|22|0|2|||2011-06-20|0
61
-NL|The Netherlands|041 71 64 300|ABNA0417164300|4!a10!n|^([A-Z]{4})(\d{10})$|14|NL91ABNA0417164300|NL2!n4!a10!n|^NL(\d{2})([A-Z]{4})(\d{10})$|18|0|3|4|3|2013-06-20|1
62
-NO|Norway|8601 11 17947|86011117947|4!n6!n1!n|^(\d{4})(\d{6})(\d{1})$|11|NO9386011117947|NO2!n4!n6!n1!n|^NO(\d{2})(\d{4})(\d{6})(\d{1})$|15|0|3|||2011-06-20|1
63
-PK|Pakistan|00260101036360|SCBL0000001123456702|4!a16!c|^([A-Z]{4})([A-Za-z0-9]{16})$|20|PK36SCBL0000001123456702|PK2!n4!a16!c|^PK(\d{2})([A-Z]{4})([A-Za-z0-9]{16})$|24|0|3|||2012-05-29|0
64
-PL|Poland|61 1090 1014 0000 0712 1981 2874|109010140000071219812874|8!n16!n|^(\d{8})(\d{16})$|24|PL61109010140000071219812874|PL2!n8!n16n|^PL(\d{2})(\d{8})(\d{1,16})$|28|0|7|||2011-06-20|1
65
-PS|Palestine|400123456702|PALS000000000400123456702|4!a21!c|^([A-Z]{4})([A-Za-z0-9]{21})$|25|PS92PALS000000000400123456702|PS2!n4!a21!c|^PS(\d{2})([A-Z]{4})([A-Za-z0-9]{21})$|29|0|3|||2013-09-05|0
66
-PT|Portugal|0002.0123.12345678901.54|000201231234567890154|4!n4!n11!n2!n|^(\d{4})(\d{4})(\d{11})(\d{2})$|21|PT50000201231234567890154|PT2!n4!n4!n11!n2!n|^PT(\d{2})(\d{4})(\d{4})(\d{11})(\d{2})$|25|0|3|4|7|2013-09-05|1
67
-QA|Qatar|QA58DOHB00001234567890ABCDEFG|DOHB00001234567890ABCDEFG|4!a4!n17!c|^([A-Z]{4})(\d{4})([A-Za-z0-9]{17})$|29|QA58DOHB00001234567890ABCDEFG|QA2!n4!a4!n17!c|^QA(\d{2})([A-Z]{4})(\d{4})([A-Za-z0-9]{17})$|29|0|3|4|7|2014-06-05|0
68
-RO|Romania|AAAA 1B31 0075 9384 0000|AAAA1B31007593840000|4!a16!c|^([A-Z]{4})([A-Za-z0-9]{16})$|20|RO49AAAA1B31007593840000|RO2!n4!a16!c|^RO(\d{2})([A-Z]{4})([A-Za-z0-9]{16})$|24|0|3|||2011-06-20|1
69
-SM|San Marino|U032 2509 8000 0000 0270 100|U0322509800000000270100|1!a5!n5!n12!c|^([A-Z]{1})(\d{5})(\d{5})([A-Za-z0-9]{12})$|23|SM86U0322509800000000270100|SM2!n1!a5!n5!n12!c|^SM(\d{2})([A-Z]{1})(\d{5})(\d{5})([A-Za-z0-9]{12})$|27|0|5|6|10|2011-06-20|1
70
-SA|Saudi Arabia|608010167519|80000000608010167519|2!n18!c|^(\d{2})([A-Za-z0-9]{18})$|20|SA0380000000608010167519|SA2!n2!n18!c|^SA(\d{2})(\d{2})([A-Za-z0-9]{18})$|24|0|1|||2012-05-29|0
71
-RS|Serbia|260-0056010016113-79|260005601001611379|3!n13!n2!n|^(\d{3})(\d{13})(\d{2})$|18|RS35260005601001611379|RS2!n3!n13!n2!n|^RS(\d{2})(\d{3})(\d{13})(\d{2})$|22|0|2|||2011-06-20|0
72
-SK|Slovak Republic|19-8742637541/1200|12000000198742637541|4!n6!n10!n|^(\d{4})(\d{6})(\d{10})$|20|SK3112000000198742637541|SK2!n4!n6!n10!n|^SK(\d{2})(\d{4})(\d{6})(\d{10})$|24|0|3|4|9|2011-06-20|1
73
-SI|Slovenia|2633 0001 2039 086|263300012039086|5!n8!n2!n|^(\d{5})(\d{8})(\d{2})$|15|SI56191000000123438|SI2!n5!n8!n2!n|^SI(\d{2})(\d{5})(\d{8})(\d{2})$|19|0|1|2|4|2012-09-09|1
74
-ES|Spain|2100 0418 45 0200051332|21000418450200051332|4!n4!n1!n1!n10!n|^(\d{4})(\d{4})(\d{1})(\d{1})(\d{10})$|20|ES9121000418450200051332|ES2!n4!n4!n1!n1!n10!n|^ES(\d{2})(\d{4})(\d{4})(\d{1})(\d{1})(\d{10})$|24|0|3|4|7|2013-09-05|1
75
-SE|Sweden|1234 12 3456 1|5000 0000 0583 9825 7466|3!n16!n1!n|^(\d{3})(\d{16})(\d{1})$|20|SE4550000000058398257466|SE2!n3!n16!n1!n|^SE(\d{2})(\d{3})(\d{16})(\d{1})$|24|0|2|||2011-06-20|1
76
-CH|Switzerland|762 1162-3852.957|00762011623852957|5!n12!c|^(\d{5})([A-Za-z0-9]{12})$|17|CH9300762011623852957|CH2!n5!n12!c|^CH(\d{2})(\d{5})([A-Za-z0-9]{12})$|21|0|4|||2011-06-20|1
77
-TN|Tunisia|10 006 0351835984788 31|10006035183598478831|2!n3!n13!n2!n|^(\d{2})(\d{3})(\d{13})(\d{2})$|20|TN5910006035183598478831|TN592!n3!n13!n2!n|^TN59(\d{2})(\d{3})(\d{13})(\d{2})$|24|0|1|2|4|2011-06-20|0
78
-TR|Turkey|0061 01299 1234567890123456789|0006100519786457841326|5!n1!c16!c|^(\d{5})([A-Za-z0-9]{1})([A-Za-z0-9]{16})$|22|TR330006100519786457841326|TR2!n5!n1!c16!c|^TR(\d{2})(\d{5})([A-Za-z0-9]{1})([A-Za-z0-9]{16})$|26|0|4|||2011-06-20|0
79
-AE|United Arab Emirates|1234567890123456|0331234567890123456|3!n16!n|^(\d{3})(\d{16})$|19|AE070331234567890123456|AE2!n3!n16!n|^AE(\d{2})(\d{3})(\d{16})$|23|0|2|||2011-06-20|0
80
-GB|United Kingdom|60-16-13 31926819|NWBK60161331926819|4!a6!n8!n|^([A-Z]{4})(\d{6})(\d{8})$|18|GB29NWBK60161331926819|GB2!n4!a6!n8!n|^GB(\d{2})([A-Z]{4})(\d{6})(\d{8})$|22|0|3|4|9|2011-06-20|1
81
-VG|British Virgin Islands|00000 12 345 678 901|VPVG0000012345678901|4!a16!n|^([A-Z]{4})(\d{16})$|20|VG96VPVG0000012345678901|VG2!n4!a16!n|^VG(\d{2})([A-Z]{4})(\d{16})$|24|0|3|||2012-05-29|0
... ...
@@ -1,319 +0,0 @@
1
-<?php
2
-
3
-# this script converts the IBAN_registry.txt file's entries to registry.txt format (php-iban's required internal format).
4
-
5
-# init
6
-require_once(dirname(dirname(__FILE__)) . '/php-iban.php');
7
-date_default_timezone_set('UTC'); # mutes a warning
8
-
9
-# read registry
10
-$data = `iconv -f utf8 -t ascii --byte-subst="<0x%x>" --unicode-subst="<U+%04X>" 'IBAN_Registry.txt'`;
11
-if($data == '') { die("Couldn't read IBAN_Registry.txt - try downloading from the location described in the REGISTRY-URL file."); }
12
-
13
-# print header line
14
-print "country_code|country_name|domestic_example|bban_example|bban_format_swift|bban_format_regex|bban_length|iban_example|iban_format_swift|iban_format_regex|iban_length|bban_bankid_start_offset|bban_bankid_stop_offset|bban_branchid_start_offset|bban_branchid_stop_offset|registry_edition|country_sepa\n";
15
-
16
-# break in to lines
17
-$lines = preg_split('/[\r\n]+/',$data);
18
-
19
-# display
20
-foreach($lines as $line) {
21
- # if it's not a blank line, and it's not the header row
22
- if($line != '' && !preg_match('/SEPA Country/',$line)) {
23
-  # extract individual tab-separated fields
24
-  $bits = explode("\t",$line);
25
-  # remove quotes and superfluous whitespace on fields that have them.
26
-  for($i=0;$i<count($bits);$i++) {
27
-   $bits[$i] = preg_replace('/^"(.*)"$/','$1',$bits[$i]);
28
-   $bits[$i] = preg_replace('/^ */','',$bits[$i]);
29
-   $bits[$i] = preg_replace('/ *$/','',$bits[$i]);
30
-  }
31
-  # assigned fields to named variables
32
-#  print "-------\n";
33
-#  print $line;
34
-#  print "-------\n";
35
-  list($country_name,$country_code,$domestic_example,$bban,$bban_structure,$bban_length,$bban_bi_position,$bban_bi_length,$bban_bi_example,$bban_example,$iban,$iban_structure,$iban_length,$iban_electronic_example,$iban_print_example,$country_sepa,$contact_details) = $bits;
36
-  # sanitise
37
-  $country_code = strtoupper(substr($country_code,0,2));       # sanitise comments away
38
-  $bban_structure = preg_replace('/[:;]/','',$bban_structure); # errors seen in Germany, Hungary entries
39
-  $iban_structure = preg_replace('/, .*$/','',$iban_structure); # duplicates for FO, GL seen in DK
40
-  $iban_electronic_example = preg_replace('/, .*$/','',$iban_electronic_example); # duplicates for FO, GL seen in DK
41
-  if($country_code=='MU') {
42
-   $iban_electronic_example = str_replace(' ','',$iban_electronic_example); # MU example has a spurious space
43
-  }
44
-  if($country_code=='CZ') {
45
-   $iban_electronic_example = preg_replace('/ \w{10,}+$/','',$iban_electronic_example); # extra example for CZ
46
-   $iban_print_example = preg_replace('/^(CZ.. .... .... .... .... ....).*$/','$1',$iban_print_example); # extra example
47
-  }
48
-  if($country_code=='FI') {
49
-   # remove additional example
50
-   $iban_electronic_example = preg_replace('/ or .*$/','',$iban_electronic_example);
51
-   # fix bban example to remove verbosity and match domestic example
52
-   $bban = '12345600000785';
53
-  }
54
-  if($country_code=='KZ') {
55
-   # fix presence of multiline free-text in KZ IBAN structure field
56
-   $iban_structure = '2!a2!n3!n13!c';
57
-  }
58
-  if($country_code=='QA') {
59
-   # fix the lack BBAN structure provision in the TXT format registry
60
-   $bban_structure = '4!a4!n17!c';
61
-   # fix broken IBAN structure provision
62
-   $iban_structure = 'QA2!n4!a4!n17!c';
63
-  }
64
-  if($country_code=='JO') {
65
-   $bban_bi_length=4; # not '4!a' as suggested
66
-  }
67
-  $iban_print_example = preg_replace('/, .*$/','',$iban_print_example); # DK includes FO and GL examples in one record
68
-
69
-  # drop leading 2!a in iban structure.
70
-  #  .. should actually be the country code in question
71
-  if(substr($iban_structure,0,3) == '2!a') {
72
-   $iban_structure = $country_code . substr($iban_structure,3);
73
-  }
74
-
75
-  # calculate $bban_regex from $bban_structure
76
-  $bban_regex = swift_to_regex($bban_structure);
77
-  # calculate $iban_regex from $iban_structure
78
-  $iban_regex = swift_to_regex($iban_structure);
79
-  print "[DEBUG] got $iban_regex from $iban_structure\n";
80
-
81
- # debugging
82
- if(true) {
83
-  print "[$country_name ($country_code)]\n";
84
-  print "Domestic account number example: $domestic_example\n";
85
-  print "BBAN structure:                  $bban_structure\n";
86
-  print "BBAN length:                     $bban_length\n";
87
-  print "BBAN bank identifier position:   $bban_bi_position\n";
88
-  print "BBAN bank identifier length:     $bban_bi_length\n";
89
-  print "BBAN bank identifier example:    $bban_bi_example\n";
90
-  print "BBAN example:                    $bban_example\n";
91
-  print "BBAN regex (calculated):         $bban_regex\n";
92
-  print "IBAN structure:                  $iban_structure\n";
93
-  print "IBAN length:                     $iban_length\n";
94
-  print "IBAN electronic format example:  $iban_electronic_example\n";
95
-  print "IBAN print format example:       $iban_print_example\n";
96
-  print "IBAN Regex (calculated):         $iban_regex\n";
97
-  print "SEPA country:                    $country_sepa\n";
98
-  print "Contact details:                 $contact_details\n\n";
99
- }
100
-
101
-  # calculate numeric $bban_length
102
-  $bban_length = preg_replace('/[^\d]/','',$bban_length);
103
-  # calculate numeric $iban_length
104
-  $iban_length = preg_replace('/[^\d]/','',$iban_length);
105
-  # calculate bban_bankid_<start|stop>_offset
106
-  # .... First we have to parse the freetext $bban_bi_position, eg: 
107
-  # Bank Identifier 1-3, Branch Identifier
108
-  # Position 1-2
109
-  # Positions 1-2
110
-  # Positions 1-3
111
-  # Positions 1-3 ;Branch is not available
112
-  # Positions 1-3, Branch identifier
113
-  # Positions 1-3, Branch identifier positions
114
-  # Positions 1-4
115
-  # Positions 1-4, Branch identifier
116
-  # Positions 1-4, Branch identifier positions
117
-  # Positions 1-5
118
-  # Positions 1-5 (positions 1-2 bank identifier; positions 3-5 branch identifier). In case of payment institutions Positions 1-5, Branch identifier positions
119
-  # Positions 1-6,  Branch identifier positions
120
-  # Positions 1-6. First two digits of bank identifier indicate the bank or banking group (For example, 1 or 2 for Nordea, 31 for Handelsbanken, 5 for cooperative banks etc)
121
-  # Positions 1-7
122
-  # Positions 1-8
123
-  # Positions 2-6, Branch identifier positions
124
-  # positions 1-3, Branch identifier positions
125
-  #
126
-  #  ... our algorithm is as follows:
127
-  #   - find all <digit>-<digit> tokens
128
-  preg_match_all('/(\d)-(\d\d?)/',$bban_bi_position,$matches);
129
-  #   - discard overlaps ({1-5,1-2,3-5} becomes {1-2,3-5})
130
-  $tmptokens = array();
131
-  for($j=0;$j<count($matches[0]);$j++) {
132
-   #print "tmptokens was... " . print_r($tmptokens,1) . "\n";
133
-   $from = $matches[1][$j];
134
-   $to = $matches[2][$j];
135
-   #      (if we don't yet have a match starting here, or it goes further,
136
-   #       overwrite the match-from-this-position record)
137
-   if(!isset($tmptokens[$from]) || $to < $tmptokens[$from]) {
138
-    $tmptokens[$from] = $to;
139
-   }
140
-  }
141
-  unset($matches); # done
142
-  #   - assume the token starting from position 1 is the bank identifier
143
-  #     (or, if it does not exist, the token starting from position 2)
144
-  $bban_bankid_start_offset = 0;              # decrement 1 on assignment
145
-  if(isset($tmptokens[1])) {
146
-   $bban_bankid_stop_offset = $tmptokens[1]-1; # decrement 1 on assignment
147
-   unset($tmptokens[1]);
148
-  }
149
-  else {
150
-   $bban_bankid_stop_offset = $tmptokens[2]-1; # decrement 1 on assignment
151
-   unset($tmptokens[2]);
152
-  }
153
-  #   - assume any subsequent token, if present, is the branch identifier.
154
-  $tmpkeys = array_keys($tmptokens);
155
-  $start = array_shift($tmpkeys);
156
-  unset($tmpkeys); # done
157
-  $bban_branchid_start_offset='';
158
-  $bban_branchid_stop_offset='';
159
-  if($start!= '') {
160
-   # we have a branch identifier!
161
-   $bban_branchid_start_offset=$start-1;
162
-   $bban_branchid_stop_offset=$tmptokens[$start]-1;
163
-  }
164
-  else {
165
-   # (note: this codepath occurs for around two thirds of all records)
166
-   # we have not yet found a branch identifier. HOWEVER, we can analyse the
167
-   # structure of the BBAN to determine whether there is more than one
168
-   # remaining non-tiny field (tiny fields on the end of a BBAN typically
169
-   # being checksums) and, if so, assume that the first/shorter one is the
170
-   # branch identifier.
171
-   $reduced_bban_structure = preg_replace('/^\d+![nac]/','',$bban_structure);
172
-#   print "[DEBUG] reduced BBAN structure = $reduced_bban_structure\n";
173
-   $tokens = swift_tokenize($reduced_bban_structure,1);
174
-#   print "[DEBUG] tokens = " + json_encode($tokens,1);
175
-   # discard any tokens of length 1 or 2
176
-   for($t=0;$t<count($tokens[0]);$t++) {
177
-    if($tokens[1][$t] < 3) {
178
-     $tokens['discarded'][$t] = 1;
179
-    }
180
-   }
181
-   # interesting fields are those that are not discarded...
182
-   if(!isset($tokens['discarded'])) {
183
-    $interesting_field_count = count($tokens[0]); }
184
-   else {
185
-    $interesting_field_count = (count($tokens[0])-count($tokens['discarded']));
186
-   }
187
-#   print "[DEBUG] interesting field count = $interesting_field_count\n";
188
-   # ...if we have at least two of them, there's a branchid-type field
189
-   if($interesting_field_count >= 2) {
190
-    # now loop through until we assign the branchid start offset
191
-    # (this occurs just after the first non-discarded field)
192
-    $found=0;
193
-    for($f=0; (($found==0) && ($f<count($tokens[0]))); $f++) {
194
-     # if this is a non-discarded token, of >2 length...
195
-     if((!isset($tokens['discarded'][$f]) || $tokens['discarded'][$f] != 1) && $tokens[1][$f]>2) {
196
-      # ... then assign.
197
-      $pre_offset = $bban_bankid_stop_offset+1; # this is the offset before we reduced the structure to remove the bankid field
198
-      $bban_branchid_start_offset = $pre_offset + $tokens['offset'][$f];
199
-      $bban_branchid_stop_offset  = $pre_offset + $tokens['offset'][$f] + $tokens[1][$f] - 1; # decrement by one on assignment
200
-      $found=1;
201
-     }
202
-    }
203
-   }
204
-  }
205
-
206
-  # fix for Jordan
207
-  if($country_code == 'JO') {
208
-   $bban_bankid_start_offset = 0;
209
-   $bban_bankid_stop_offset = 3;
210
-   $bban_branchid_start_offset = 4;
211
-   $bban_branchid_stop_offset = 7;
212
-  }
213
-
214
-  # calculate 1=Yes, 0=No for $country_sepa
215
-  # NOTE: This is buggy due to the free inclusion of random text by the registry publishers.
216
-  #       Notably it requires modification for places like Finland and Portugal where these
217
-  #       comments are known to exist.
218
-  if(strtolower($country_sepa)=='yes') { $country_sepa=1; } else { $country_sepa = 0; }
219
-  # set registry edition
220
-  $registry_edition = date('Y-m-d');
221
-
222
-  # now prepare generate our registry lines...
223
-  $to_generate = array($country_code=>$country_name);
224
-  if($country_code == 'DK') {
225
-   $to_generate = array('DK'=>$country_name,'FO'=>'Faroe Islands','GL'=>'Greenland');
226
-  }
227
-  elseif($country_code == 'FR') {
228
-   $to_generate = array('FR'=>$country_name,'BL'=>'Saint Barthelemy','GF'=>'French Guyana','GP'=>'Guadelope','MF'=>'Saint Martin (French Part)','MQ'=>'Martinique','RE'=>'Reunion','PF'=>'French Polynesia','TF'=>'French Southern Territories','YT'=>'Mayotte','NC'=>'New Caledonia','PM'=>'Saint Pierre et Miquelon','WF'=>'Wallis and Futuna Islands');
229
-  }
230
-
231
-  # output loop
232
-  foreach($to_generate as $country_code=>$country_name) {
233
-   # fixes for fields duplicating country code
234
-   #print "CHECKSUM-BEFORE[$country_code] = $iban_electronic_example\n";
235
-   $iban_electronic_example = iban_set_checksum($country_code .  substr($iban_electronic_example,2));
236
-   #print "CHECKSUM-AFTER[$country_code]  = $iban_electronic_example\n";
237
-   $iban_structure = $country_code . substr($iban_structure,2);
238
-   # step 1
239
-   $iban_regex_fixed = '^' . $country_code;
240
-   $tmp_country_code = substr($iban_regex,1,2);
241
-   #print "[DEBUG] $tmp_country_code\n";
242
-   # route #1 ... here we are dealing with a country code in the string already
243
-   if(preg_match('/^[A-Z][A-Z]$/',$tmp_country_code)) {
244
-    #print "[DEBUG] route #1\n";
245
-    $iban_regex_fixed = $iban_regex_fixed . substr($iban_regex,3);
246
-   }
247
-   # route #2 ... here there is no country code yet present
248
-   else {
249
-    #print "[DEBUG] route #2\n";
250
-    $iban_regex_fixed = $iban_regex_fixed . substr($iban_regex,1);
251
-   }
252
-   #print "[DEBUG] substited '$iban_regex_fixed' for '$iban_regex'\n";
253
-   # output
254
-   print "$country_code|$country_name|$domestic_example|$bban_example|$bban_structure|$bban_regex|$bban_length|$iban_electronic_example|$iban_structure|$iban_regex_fixed|$iban_length|$bban_bankid_start_offset|$bban_bankid_stop_offset|$bban_branchid_start_offset|$bban_branchid_stop_offset|$registry_edition|$country_sepa\n";
255
-  }
256
-
257
- }
258
-}
259
-
260
-# swift_to_regex()
261
-#  converts the SWIFT IBAN format specifications to regular expressions
262
-#  eg: 4!n6!n1!n -> ^(\d{4})(\d{6})(\d{1})$
263
-function swift_to_regex($swift) {
264
- # first find tokens
265
- $matches = swift_tokenize($swift);
266
- # now replace bits
267
- $tr = '^' . $swift . '$';
268
- # loop through each matched token
269
- for($i=0;$i<count($matches[0]);$i++) {
270
-  # calculate replacement
271
-  $replacement = '(TOKEN)';
272
-  # type 'n'
273
-  if($matches[3][$i] == 'n') { 
274
-   $replacement = '(\d{length})';
275
-  }
276
-  # type 'c'
277
-  elseif($matches[3][$i] == 'c') {
278
-   $replacement = '([A-Za-z0-9]{length})';
279
-  }
280
-  # type 'a'
281
-  elseif($matches[3][$i] == 'a') {
282
-   $replacement = '([A-Z]{length})';
283
-#' . $matches[1][$i] . '})';
284
-  }
285
-  else {
286
-   print "unknown type: $matches[3][$i]\n";
287
-   exit(1);
288
-  }
289
-  # now add length indicator to the token
290
-  $length = '(LENGTH)';
291
-  if($matches[2][$i] == '!') {
292
-    $length = $matches[1][$i];
293
-  }
294
-  else {
295
-   $length = '1,' . $matches[1][$i];
296
-  }
297
-  $replacement = preg_replace('/length/',$length,$replacement,1);
298
-  # finally, replace the entire token with the replacement
299
-  $tr = preg_replace('/' . $matches[0][$i] . '/',$replacement,$tr,1);
300
- }
301
- return $tr;
302
-}
303
-
304
-# swift_tokenize()
305
-#  fetch individual tokens in a swift structural string
306
-function swift_tokenize($string,$calculate_offsets=0) {
307
- preg_match_all('/((?:\d*?[1-2])?\d)(!)?([anc])/',$string,$matches);
308
- if($calculate_offsets) {
309
-  $current_offset=0;
310
-  for($i=0;$i<count($matches[0]);$i++) {
311
-   $matches['offset'][$i] = $current_offset;
312
-   $current_offset+=$matches[1][$i];
313
-  }
314
-  #print "ANALYSE[raw]: " . join(',',$matches['offset']);
315
- }
316
- return $matches;
317
-}
318
-
319
-?>
... ...
@@ -1,91 +0,0 @@
1
-<?php
2
-
3
-# Basic test script for the object-oriented version of the php-iban library
4
-#  - Exit status is 0 in case of success, or the number of failed tests
5
-#    in case of failure
6
-
7
-# Engine configuration
8
-#  - first we enable error display
9
-ini_set('display_errors',1);
10
-#  - next we ensure that all errors are displayed
11
-ini_set('error_reporting',E_ALL);
12
-
13
-# include the object oriented version of the library itself
14
-require_once(dirname(dirname(__FILE__)) . '/oophp-iban.php');
15
-
16
-# display registry contents
17
-#print_r($_iban_registry);
18
-
19
-# init
20
-$errors=0;
21
-
22
-# Try to validate an invalid IBAN
23
-$iban = "(@#(*@*ZV-This is NOT an IBAN!";
24
-$myIban = new IBAN($iban);
25
-if($myIban->verify()) {
26
- print "ERROR: An invalid IBAN was validated!\n";
27
- $errors++;
28
-}
29
-print "Hooray! - Invalid IBAN successfully rejected.\n\n";
30
-
31
-# Broken IIBAN
32
-$broken_iiban = 'AA12011123ZS6';
33
-$myIban = new IBAN($broken_iiban);
34
-$suggestions = $myIban->MistranscriptionSuggestions();
35
-if(count($suggestions)) {
36
- print "Hooray!  Successfully derived '" . implode(',',$suggestions) . "' as likely transcription error source suggestion(s) for the incorrect IBAN $broken_iiban.\n";
37
-}
38
-else {
39
- print "ERROR: Not able to ascertain suggested transcription error source(s) for $broken_iiban.\n";
40
-}
41
-print "\n";
42
-
43
-# Get list of countries
44
-$countries = $myIban->Countries();
45
-
46
-# Loop through the registry's examples, validating
47
-foreach($countries as $countrycode) {
48
-
49
- # instantiate
50
- $myCountry = new IBANCountry($countrycode);
51
-
52
- # start section
53
- print "[$countrycode: " . $myCountry->Name() . "]\n";
54
-
55
- # output remaining country properties
56
- print "Is a SEPA member? ";
57
- if($myCountry->IsSEPA()) { print "Yes"; } else { print "No"; }
58
- print ".\n";
59
-
60
- # get example iban
61
- $myIban = new IBAN($myCountry->IBANExample());
62
-
63
- # output example iban properties one by one
64
- print "Example IBAN: " . $myIban->HumanFormat() . "\n";
65
- print " - country  " . $myIban->Country() . "\n";
66
- print " - checksum " . $myIban->Checksum() . "\n";
67
- print " - bban     " . $myIban->BBAN() . "\n";
68
- print " - bank     " . $myIban->Bank() . "\n";
69
- print " - branch   " . $myIban->Branch() . "\n";
70
- print " - account  " . $myIban->Account() . "\n";
71
- 
72
- # output all properties
73
- #$parts = $myIban->Parts();
74
- #print_r($parts);
75
- 
76
- # verify
77
- print "\nChecking validity... ";
78
- if($myIban->Verify()) {
79
-  print "IBAN $myIban->iban is valid.\n";
80
- }
81
- else {
82
-  print "ERROR: IBAN $myIban->iban is invalid.\n";
83
-  $errors++;
84
- }
85
-
86
- print "\n";
87
-}
88
-
89
-exit($errors);
90
-
91
-?>
... ...
@@ -1,86 +0,0 @@
1
-<?php
2
-
3
-# Basic test script for the php-iban library
4
-#  - Exit status is 0 in case of success, or the number of failed tests
5
-#    in case of failure
6
-
7
-# Engine configuration
8
-#  - first we enable error display
9
-ini_set('display_errors',1);
10
-#  - next we ensure that all errors are displayed
11
-ini_set('error_reporting',E_ALL);
12
-
13
-# include the library itself
14
-require_once(dirname(dirname(__FILE__)) . '/php-iban.php');
15
-
16
-# display registry contents
17
-#print_r($_iban_registry);
18
-
19
-# init
20
-$errors=0;
21
-
22
-# Try to validate an invalid IBAN
23
-$iban = "(@#(*@*ZV-This is NOT an IBAN!";
24
-if(verify_iban($iban)) {
25
- print "ERROR: An invalid IBAN was validated!\n";
26
- $errors++;
27
-}
28
-print "Hooray! - Invalid IBAN successfully rejected.\n\n";
29
-
30
-# Broken IIBAN
31
-$broken_iiban = 'AA12011123ZS6';
32
-$suggestions = iban_mistranscription_suggestions($broken_iiban);
33
-if(count($suggestions)) {
34
- print "Hooray!  Successfully derived '" . implode(',',$suggestions) . "' as likely transcription error source suggestion(s) for the incorrect IBAN $broken_iiban.\n";
35
-}
36
-else {
37
- print "ERROR: Not able to ascertain suggested transcription error source(s) for $broken_iiban.\n";
38
-}
39
-print "\n";
40
-
41
-# Loop through the registry's examples, validating
42
-foreach($_iban_registry as $country) {
43
-
44
- # get country code
45
- $countrycode = $country['country'];
46
-
47
- # start section
48
- print "[$countrycode: " . iban_country_get_country_name($countrycode) . "]\n";
49
-
50
- # output remaining country properties
51
- print "Is a SEPA member? ";
52
- if(iban_country_is_sepa($countrycode)) { print "Yes"; } else { print "No"; }
53
- print ".\n";
54
-
55
- # get example iban
56
- $iban = $country['iban_example'];
57
-
58
- # output example iban properties one by one
59
- print "Example IBAN: " . iban_to_human_format($iban) . "\n";
60
- print " - country  " . iban_get_country_part($iban) . "\n";
61
- print " - checksum " . iban_get_checksum_part($iban) . "\n";
62
- print " - bban     " . iban_get_bban_part($iban) . "\n";
63
- print " - bank     " . iban_get_bank_part($iban) . "\n";
64
- print " - branch   " . iban_get_branch_part($iban) . "\n";
65
- print " - account  " . iban_get_account_part($iban) . "\n";
66
- 
67
- # output all properties
68
- #$parts = iban_get_parts($iban);
69
- #print_r($parts);
70
- 
71
- # verify
72
- print "\nChecking validity... ";
73
- if(verify_iban($iban)) {
74
-  print "IBAN $iban is valid.\n";
75
- }
76
- else {
77
-  print "ERROR: IBAN $iban is invalid.\n";
78
-  $errors++;
79
- }
80
-
81
- print "\n";
82
-}
83
-
84
-exit($errors);
85
-
86
-?>
... ...
@@ -17,8 +17,6 @@ Nevertheless, in case you use a significant part of this code, we ask (but not r
17 17
 require_once('inc/base.php');
18 18
 require_once('inc/security.php');
19 19
 
20
-include("external/php-iban/php-iban.php");
21
-
22 20
 
23 21
 function my_invoices()
24 22
 {
25 23