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})?$/
что есть:
- начало строки
^
- четыре буквенно-цифровых символов,
[a-z0-9]{4}
- два числа,
\d{2}
- три дополнительно (
?
суффикс) alphanumerich символов([a-z0-9]{3})?
- конец строки
$
вы можете увидеть его в действии и проверить его здесь (я использовал ваши образцы).
В любом случае, из правил, которые вы сообщаете, OPSKATWW
не должен быть действительным BIC, так как он не имеет номеров после первых 6 букв.
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
отметит правильный ответ. Спасибо за объяснение.