BIC 检查的正则表达式
Posted
技术标签:
【中文标题】BIC 检查的正则表达式【英文标题】:Regex for BIC check 【发布时间】:2013-04-01 22:47:29 【问题描述】:我为 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: 它的长度为 8 个或 11 个字符,包括:
银行代码 - 4 个字母字符 国家代码 - 2 个字母 位置代码 - 2 个字母数字字符,零除外 分行代码 - 3 个字母数字字符
这些是规格。
所以长度可以是 11 或 8,前 4 可以是任何东西,然后 2 个字母是必须的,然后是 2 个数字和可选的 3 个字母数字。
以下内容无效:
abcdefxx
abcdefxxyyy
这些也是无效的:
aaaa11xx
aaaa11xxyyy
等等。
【问题讨论】:
您能提供更多信息吗?例如,正确的 BIC 应该和不应该看起来如何...... 愿意 :) 一会儿 @Sangoku 你能给我们举个例子,说明什么不应该起作用,但做了吗? 【参考方案1】:我不建议使用它,因为它缺乏性能,但如果有人需要根据ISO-3366-1 国家代码验证 IBANS:
/^[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
这也是内容验证,而不仅仅是格式验证。 但它会为你节省一些代码:)
【讨论】:
你在回答什么问题?【参考方案2】: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|x3)?$/',$val);
【讨论】:
这个纯代码答案的解释在哪里?与此页面上已有的答案相比,这个答案在哪些方面更好/更有价值?为什么要使用这种很长的模式? 每个答案都应该包含简单的英文解释。这是我第二次告诉你这个。请编辑您的问题,以教育/授权 OP 和成千上万的未来研究人员。【参考方案3】:这是用于验证 BIC 的官方 SEPA 模式
[A-Z]6,6[A-Z2-9][A-NP-Z0-9]([A-Z0-9]3,3)0,1
【讨论】:
你在哪里找到的? 例如匹配SCHEDULE
和 Websense
这样的词,不推荐。即使效率低下,上面@serraine 的答案至少是准确的。【参考方案4】:
结构
最新版本是 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)
(德语-Wiki中的不同定义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|x3)?$/i'
【讨论】:
添加正则表达式的各个部分如何与规范相关的细分会很有用。 德语***还说可选的分支名称不能以“X”开头,除非它是 XXX。那么正则表达式将是'/^[A-Z]6[2-9A-Z][0-9A-NP-Z](XXX|[0-9A-WYZ][0-9A-Z]2)?$/i'
【参考方案5】:
好的。对于所有对此类问题有相同问题的人,正确的正则表达式是:
/^[0-9a-z]4[a-z]2[0-9a-z]2([0-9a-z]3)?\z/i
你的@Qtax 提供它。我只是稍微改进了一下。
编辑调整是我改变了它,所以前 4 个字母可以是字母数字,但它后面的 2 个字母必须代表一个国家的国际代码。这就是为什么只有字母。我与具有实际使用代码的实际用户进行了检查。它们可以在前 4 个位置具有数值。
编辑:
我错了。前 4 个不能只有字母。我正在转达 Reifeisen Bank 的一名员工的一份声明,当时我正在讨论该标准。原来他在想银行内部的号码,不知道什么系统不能是有效的代码。事实证明并非如此。
所以正确的语法是
/^6[a-z]2[0-9a-z]2([0-9a-z]3)?\z/i
将标记正确答案。谢谢你指出。
【讨论】:
为什么前4个字符要加数字?这不在您的问题中,也不在链接的规范中。 那是国家代码和数字。相信我这个没问题:) 对于所有使用负 4 个字母评分的人可以包含某些国家/地区的数字,但它的末尾必须有 2 个数字,否则银行的支票将失败。在此电话之后,我直接调用了银行 api。 Sangoki 的最后一个正则表达式不正确。 BIC 的前四个字符必须是字母而不是数字。我认为正确的是: /^[az]4[az]2[0-9a-z]2([0-9a-z]3)?\z/i 或- 使其更短 /^[az]6[0-9a-z]2([0-9a-z]3)?\z/i【参考方案6】:我认为这个可以:
/^[a-z0-9]4[a-z]2\d2([a-z0-9]3)?$/
即:
-
字符串开始,
^
四个字母数字字符,[a-z0-9]4
两个数字,\d2
三个可选(?
后缀)字母数字字符,([a-z0-9]3)?
字符串结束,$
您可以看到它并对其进行测试here(我使用了您的示例)。
无论如何,根据您报告的规则,OPSKATWW
不应该是有效的 BIC,因为它在前 6 个字母之后没有数字。
【讨论】:
我需要 z/i 以确保它不区分大小写。 \d2 部分很好。会注意到它。 /d 十进制。不错。 对不起,我的意思是/^[a-z0-9]4[a-z]2\d2([a-z0-9]3)?$/i
。 z
是干什么用的?无论如何,您也可以在针对此正则表达式进行测试之前执行$bic=strtolower($bic)
。【参考方案7】:
您使用^
作为分隔符?你可能想要更多类似的东西:
'/^[a-z]6[0-9a-z]2([0-9a-z]3)?\z/i'
【讨论】:
"使用 PCRE 函数时,要求模式用分隔符括起来。分隔符可以是任何非字母数字、非反斜杠、非空白字符。”Source。使用^
作为分隔符应该没有问题。
@Loamhoof,这是个问题,因为他想锚定表达式。这就是为什么我猜^
被用作第一个字符。
说实话....这只是巧合...我以 ^()^ piggy :) 开始了正则表达式 :)
@Qtax 肯定他想这样做,但是如果没有一个匹配的例子,而它不应该匹配,我们不能确定这是真正的问题。 (我猜^^
应该可以工作,但仍然很丑。)
PHP sn-p $result_bic = (bool) ( preg_match('/^[a-z]6[0-9a-z]2([0-9a-z]3)?\z/i', $bic) == 1 );
以上是关于BIC 检查的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章