2013-04-10 50 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