用于BIC检查的正则表达式

时间:2013-04-10 07:51:59

标签: php regex preg-match bank iban

我为php函数pregmatch编写了一个正则表达式,如下所示:

^([a-zA-Z]){4}([a-zA-Z]){2}([0-9a-zA-Z]){2}([0-9a-zA-Z]{3})?$^

现在我需要检查BIC字符串的一致性。

它出了点问题......总是正确的。我不明白为什么。

我使用的代码是这样的:

/**
 * Checks the correct format from the 
 * @param string $bic
 * @return boolean
 */
public function checkBic($bic)
{
    $bic = $this->cleanFromSeparators($bic);
    if (preg_match($this->getBicCompare(), $bic)) {
        return true;
    } else {
        return false;
    }
}

private function getBicCompare()
{
    return "^([a-zA-Z]){4}([a-zA-Z]){2}([0-9a-zA-Z]){2}([0-9a-zA-Z]{3})?$^";
}

编辑:

以下是来自swift帐户的BIC格式的一些参考:

http://www.sage.co.uk/sage1000v2_1/form_help/workingw/subfiles/iban_and_bic.htm

http://en.wikipedia.org/wiki/ISO_9362

http://www.swift.com/products_services/bic_and_iban_format_registration_bic_details?rdct=t

BIC的一个例子是:

NOLADE21STS

OPSKATWW

如果字符串包含以下代码,则正则表达式只应返回true: 它的长度是八个或十一个字符,包括:

银行代码 - 4个字母字符 国家代码 - 2个字母 位置代码 - 2个字母数字字符,零除外 分支代码 - 3个字母数字字符

这些是规格。

所以长度可以是11或8,前4可以是任何东西,然后2个字母是必须的,然后是2个数字和可选的3个字母数字。

以下内容无效:

abcdefxx

abcdefxxyyy

这些也无效:

aaaa11xx

aaaa11xxyyy

等等。

7 个答案:

答案 0 :(得分:14)

您使用^作为分隔符?你可能想要更像的东西:

'/^[a-z]{6}[0-9a-z]{2}([0-9a-z]{3})?\z/i'

答案 1 :(得分:7)

  

结构

     

最新版本是ISO 9362:2009(2009-10-01)。 SWIFT代码   是8或11个字符,由:

组成      

4个字母:机构代码或银行代码。

     

2个字母:ISO 3166-1 alpha-2国家代码

     

2个字母或数字:位置代码

     

如果第二个字符为“0”,那么它通常是测试BIC   反对在实时网络上使用的BIC。如果第二个字符是   “1”,然后它表示SWIFT网络中的被动参与者   第二个字符是“2”,然后它通常表示反向计费   BIC,收件人支付邮件而不是更多   通常模式,发件人支付邮件。

     

3个字母或数字:分支代码,可选('XXX'代表主要代码   办公室)

http://en.wikipedia.org/wiki/ISO_9362

(德语-Viki http://de.wikipedia.org/wiki/ISO_9362中的不同定义)

  

2个字母或数字:位置代码   第一个字符不能是数字“0”或“1”。   字母“O”不允许作为第二个字符。   (此定义的正则表达式:[2-9a-z] [0-9a-np-z])

'/^[a-z]{6}[2-9a-z][0-9a-np-z]([a-z0-9]{3}|x{3})?$/i'

答案 2 :(得分:1)

我认为这个会做:

/^[a-z0-9]{4}[a-z]{2}\d{2}([a-z0-9]{3})?$/

那是:

  1. 字符串的开头,^
  2. 四个字母数字字符[a-z0-9]{4}
  3. 两个数字,\d{2}
  4. 三个可选(?后缀)alphanumerich字符,([a-z0-9]{3})?
  5. 字符串结尾,$
  6. 您可以在行动中看到它并对其进行测试here(我使用了您的样本)。 无论如何,根据您报告的规则,OPSKATWW不应该是有效的BIC,因为它在前6个字母后面没有数字。

答案 3 :(得分:0)

这是用于验证BIC的官方SEPA模式

[A-Z]{6,6}[A-Z2-9][A-NP-Z0-9]([A-Z0-9]{3,3}){0,1}

答案 4 :(得分:0)

我不建议使用它,因为它缺乏性能,但是如果有人需要ISO-3366-1国家/地区代码验证:

/^[A-Z]{4}(AC|AD|AE|AF|AG|AI|AL|AM|AN|AO|AQ|AR|AS|AT|AU|AW|AX|AZ|BA|BB|BD|BE|BF|BG|BH|BI|BJ|BL|BM|BN|BO|BQ|BR|BS|BT|BV|BW|BY|BZ|CA|CC|CD|CE|CF|CG|CH|CI|CK|CL|CM|CN|CO|CP|CR|CS|CU|CV|CW|CX|CY|CZ|DD|DE|DG|DJ|DK|DM|DO|DZ|EA|EC|EE|EG|EH|ER|ES|ET|EU|FI|FJ|FK|FM|FO|FR|FX|GA|GB|GD|GE|GF|GG|GH|GI|GL|GM|GN|GP|GQ|GR|GS|GT|GU|GW|GY|HK|HM|HN|HR|HT|HU|IC|ID|IE|IL|IM|IN|IO|IQ|IR|IS|IT|JE|JM|JO|JP|KE|KG|KH|KI|KM|KN|KP|KR|KW|KY|KZ|LA|LB|LC|LI|LK|LR|LS|LT|LU|LV|LY|MA|MC|MD|ME|MF|MG|MH|MK|ML|MM|MN|MO|MP|MQ|MR|MS|MT|MU|MV|MW|MX|MY|MZ|NA|NC|NE|NF|NG|NI|NL|NO|NP|NR|NT|NU|NZ|OM|PA|PE|PF|PG|PH|PK|PL|PM|PN|PR|PS|PT|PW|PY|QA|RE|RO|RS|RU|RW|SA|SB|SC|SD|SE|SF|SG|SH|SI|SJ|SK|SL|SM|SN|SO|SR|SS|ST|SU|SV|SX|SY|SZ|TA|TC|TD|TF|TG|TH|TJ|TK|TL |TM|TN|TO|TP|TR|TT|TV|TW|TZ|UA|UG|UK|UM|US|UY|UZ|VA|VC|VE|VG|VI|VN|VU|WF|WS|XK|YE|YT|ZA|ZM|ZR|ZW|)[2-9A-Z][0-9A-NP-Z](XXX|[0-9A-WYZ][0-9A-Z]{2})?$/i

这也是内容验证,而不仅仅是格式验证。 但这会为您节省一些代码:)

答案 5 :(得分:0)

echo preg_match('/^[A-Z]{4}(AC|AD|AE|AF|AG|AI|AL|AM|AN|AO|AQ|AR|AS|AT|AU|AW|AX|AZ|BA|BB|BD|BE|BF|BG|BH|BI|BJ|BL|BM|BN|BO|BQ|BR|BS|BT|BV|BW|BY|BZ|CA|CC|CD|CE|CF|CG|CH|CI|CK|CL|CM|CN|CO|CP|CR|CS|CU|CV|CW|CX|CY|CZ|DD|DE|DG|DJ|DK|DM|DO|DZ|EA|EC|EE|EG|EH|ER|ES|ET|EU|FI|FJ|FK|FM|FO|FR|FX|GA|GB|GD|GE|GF|GG|GH|GI|GL|GM|GN|GP|GQ|GR|GS|GT|GU|GW|GY|HK|HM|HN|HR|HT|HU|IC|ID|IE|IL|IM|IN|IO|IQ|IR|IS|IT|JE|JM|JO|JP|KE|KG|KH|KI|KM|KN|KP|KR|KW|KY|KZ|LA|LB|LC|LI|LK|LR|LS|LT|LU|LV|LY|MA|MC|MD|ME|MF|MG|MH|MK|ML|MM|MN|MO|MP|MQ|MR|MS|MT|MU|MV|MW|MX|MY|MZ|NA|NC|NE|NF|NG|NI|NL|NO|NP|NR|NT|NU|NZ|OM|PA|PE|PF|PG|PH|PK|PL|PM|PN|PR|PS|PT|PW|PY|QA|RE|RO|RS|RU|RW|SA|SB|SC|SD|SE|SF|SG|SH|SI|SJ|SK|SL|SM|SN|SO|SR|SS|ST|SU|SV|SX|SY|SZ|TA|TC|TD|TF|TG|TH|TJ|TK|TL|TM|TN|TO|TP|TR|TT|TV|TW|TZ|UA|UG|UK|UM|US|UY|UZ|VA|VC|VE|VG|VI|VN|VU|WF|WS|XK|YE|YT|ZA|ZM|ZR|ZW)[2-9A-Z][0-9A-NP-Z]([A-Z0-9]{3}|x{3})?$/',$val);

答案 6 :(得分:-2)

确定。对于所有对这类问题有同样问题的人来说,正确的正则表达式是:

/^[0-9a-z]{4}[a-z]{2}[0-9a-z]{2}([0-9a-z]{3})?\z/i

你的@Qtax提供它。我只是稍微改进了一下。

编辑调整是因为我改变了所以前4个字母可以是字母数字,但是之后的2个字母必须代表国家的国际代码。这就是为什么只有字母。我检查了具有真实使用代码的实际用户。它们可以在前4个位置具有数值。

修改

我错了。最好的4个只能是字母。我正在转发Reifeisen银行的一份员工的资料,我正在讨论该标准。它更糟糕的是,他正在考虑从他们内部的银行号码不知道什么系统可以是一个有效的代码。事实证明并非如此。

所以正确的sintax是

/^{6}[a-z]{2}[0-9a-z]{2}([0-9a-z]{3})?\z/i

将标记正确的答案。谢谢你指出来。