Regex для проверки Бик

Я написал регулярное выражение для функции 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})?$^";
}

EDIT:

вот некоторые ссылки для формата BIC из swift учетная запись:

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

и так далее.

5 ответов


вы используете ^ в качестве разделителя? Вы, вероятно, хотите что-то больше, как:

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

структура

последнее издание 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" для основного office)

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

(различных определение на немецком языке-Wiki http://de.wikipedia.org/wiki/ISO_9362)

2 буквы или цифры: код местоположения Первый символ не должен быть цифрой "0"или " 1". Буква " О " не допускается в качестве второго символа. (Регулярное выражение для этого определения: [2-9a-z][0-9a-np-z])

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

Я думаю, этот подойдет:

/^[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. конец строки $

вы можете увидеть его в действии и проверить его здесь (я использовал ваши образцы). В любом случае, из правил, которые вы сообщаете, OPSKATWW не должен быть действительным BIC, так как он не имеет номеров после первых 6 букв.


это официальный шаблон SEPA для проверки BIC

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

Ok. для всех, у кого есть те же проблемы с этой проблемой, правильное регулярное выражение:

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

thy @Qtax для его предоставления. я просто немного его усовершенствовал.

Edit настройка заключалась в том, что я изменил ее, чтобы первые 4 буквы могли быть буквенно-цифровыми, но 2 буквы после нее должны представлять международный код для страны. Вот почему только письма. И я проверил его с реальными пользователями, у которых есть реальные коды использования. Они могут иметь числовые значения в первых 4 позициях.

Edit:

Я был неправ. firtst 4 не может быть только буквами. Я передавал сообщение о сотруднике банка "Райфайзен", с которым обсуждал стандарт. Он думал, что номер банка из их внутреннего понятия не имеет, какая система может быть действительным кодом. Как оказалось, это не так.

таким образом, правильный синтакс

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

отметит правильный ответ. Спасибо за объяснение.