2013-04-10 126 views
9

我写PHP函数pregmatch一个正则表达式是这样的:正则表达式BIC检查

^([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

等。

+1

可以请你提供更多的信息?例如,如何正确的BIC应该和不应该看... – 2013-04-10 07:53:33

+0

威尔:)只是一瞬间 – Sangoku 2013-04-10 07:57:23

+1

@Sangoku您能给我们带来什么不应该工作的例子,但没有? – Loamhoof 2013-04-10 08:12:58

回答

13

您正在使用^作为分隔符?你可能想要更类似于:

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

“*当使用PCRE函数,它要求该图案由封闭定界符分隔符可以是任何非字母数字的,非反斜杠,非空白字符*。” [来源](HTTP:// PHP。净/手动/ EN/regexp.reference.delimiters.php)。使用'^'作为分隔符不应该是个问题。 – Loamhoof 2013-04-10 08:09:03

+0

@Loamhoof,这是一个问题,因为他想锚定表达。这就是为什么我猜''用作第一个字符。 – Qtax 2013-04-10 08:10:10

+0

说实话.... THT只是巧合......我开始正则表达式为^()^小猪:) – Sangoku 2013-04-10 08:12:02

-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 

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

+1

为什么你要给前4个字符添加数字?这不在你的问题中,也不在链接规范中。 – Qtax 2013-04-10 13:23:37

+0

这是国家和人数的代码。请相信我这一个是OK :) – Sangoku 2013-06-18 06:29:31

+0

对于所有持续4个字母分级的人来说,可以包含一些国家的数字,但是在结束时必须有2个数字,否则银行的支票将失败。此通话后,我直接拨打银行api。 – Sangoku 2013-10-01 12:15:35

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. 结束,$

你可以看到它在行动和测试here(我用了你的样品)。 无论如何,从您报告的规则来看,OPSKATWW不应该是有效的BIC,因为它在前6个字母后没有数字。

+0

我需要在z/i到确保?它不区分大小写。 \ d {2}部分很好。会注意到它。/d小数。好一个。 – Sangoku 2013-04-10 17:08:49

+0

对不起,我的意思是'/^[a-z0-9] {4} [a-z] {2} \ d {2}([a-z0-9] {3})?$/i'。 z是什么?无论如何,在对这个正则表达式进行测试之前,您还可以执行'$ bic = strtolower($ bic)'。 – 2013-04-11 07:55:26

+0

\ z - 主题结尾 – Sangoku 2013-04-11 10:54:43

6

结构

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

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

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

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

如果第二字符是 “0”,则它通常是一个测试BIC作为 相对到现场网络上使用的BIC。如果第二字符是 “1”,那么它表示SWIFT网络中的被动参与者如果 第二个字符是“2”,那么它通常表示一个反向计费 BIC,其中,接收者支付消息

,而不是发送者支付 消息的更常见模式。3个字母或数字:分支代码,可选的( 'XXX' 为初级 办公室)

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

(在不同的定义德国维基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' 
+3

添加关于正则表达式的各个部分与规范相关的细节将很有用。 – forivall 2013-09-27 18:36:35