ruby/rails определяет данные финансового трека и возвращает ноль / пустую строку
Я прочитал похожие вопросы о стековом потоке, чтобы понять данные финансовой карты.
Я думаю, что проблема, с которой я сталкиваюсь, может быть немного другой или, возможно, я действительно слаб в регулярных выражениях.
Теперь у нас есть сервис, который случайно возвращает данные трека вместо имени гостя.
Моя цель - каждый раз, когда я получаю данные трека, я отображаю "" пустую строку, иначе возвращаю имя гостя.(Это временное решение, пока мы не исправим основную причину)
Это то, что мои регулярные выражения, но похоже, что он не обнаруживает данные трека.
irb(main):043:0> guestname="%4234242xx12^TEST/GUEST L ^324532635645744646462"
irb(main):044:0> (/[(%[bB])(;)]\d{3,}.{9,}[(^.+^)(=)].+\?.{,2}/.match(guestname)) ? "" : guestname
=> "%4234242xx12^TEST/GUEST L ^324532635645744646462"
(Не реальные данные)
Теперь, глядя на вики для информации о треках, я хочу охватить большинство случаев, если не все:
https://en.wikipedia.org/wiki/Magnetic_stripe_card
Может ли помочь с моим регулярным выражением. Вот что у меня есть:
/[(%[bB])(;)]\d{3,}.{9,}[(^.+^)(=)].+\?.{,2}
/
Трек 1, формат B:
Начните стражу - один символ (обычно '%')
Код формата ="B" - один символ (только альфа)
Основной номер счета (PAN) - до 19 символов. Обычно, но не всегда, совпадает с номером кредитной карты, напечатанным на лицевой стороне карты.
Разделитель полей - один символ (обычно '^')
Имя - от 2 до 26 символов
Разделитель полей - один символ (обычно '^')
Срок годности - четыре символа в виде YYMM.
Сервисный код - три символа
Дискреционные данные - могут включать в себя ключевой индикатор подтверждения PIN-кода (PVKI, 1 символ), значение подтверждения PIN-кода (PVV, 4 символа), значение проверки карты или код подтверждения карты (CVV или CVC, 3 символа)
Конечный страж - один символ (обычно '?')
Продольная проверка избыточности (LRC) - это один символ и символ достоверности, рассчитанный по другим данным на дорожке.
Трек 2: Этот формат был разработан банковской индустрией (ABA). Этот трек написан по 5-битной схеме (4 бита данных + 1 контроль четности), которая допускает шестнадцать возможных символов, которые являются числами 0-9, плюс шесть символов:; < = >?, Выбор шести знаков пунктуации может показаться странным, но на самом деле шестнадцать кодов просто отображаются в диапазон ASCII от 0x30 до 0x3f, который определяет десять цифровых символов плюс эти шесть символов. Формат данных следующий:
Начать страж - один символ (обычно ';')
Основной номер счета (PAN) - до 19 символов. Обычно, но не всегда, совпадает с номером кредитной карты, напечатанным на лицевой стороне карты.
Разделитель - один символ (обычно '=')
Срок годности - четыре символа в виде YYMM.
Сервисный код - три цифры. Первая цифра определяет правила обмена, вторая - обработку авторизации, а третья - спектр услуг.
Дискреционные данные - как в первой дорожке
Конечный страж - один символ (обычно '?')
Продольная проверка избыточности (LRC) - это один символ и символ достоверности, рассчитанный по другим данным на дорожке. Большинство считывающих устройств не возвращают это значение, когда карта переносится на уровень представления, и используют его только для внутренней проверки считывателя.
1 ответ
- Ваш пример входной строки не содержит код формата после первого стража.
- Вы пытаетесь разобрать HTML-кодированную версию, что странно.
Итак, я бы начал с html-декодирования. Например, с Нокогири:
▶ guestname="%4234242xx12^TEST/GUEST L ^324532635645744646462"
#⇒ "%4234242xx12^TEST/GUEST L ^324532635645744646462"
▶ parsed = Nokogiri::HTML.parse(guestname).text
#⇒ "%4234242xx12^TEST/GUEST L ^324532635645744646462"
Хорошо, теперь у нас есть, по крайней мере, ведущий процент. Теперь давайте спросим себя: у скольких пользователей имя гостя начинается со знака процента? Бьюсь об заклад, никто. Вы можете перепроверить себя, выполнив запрос к вашей базе данных. Поскольку это временное решение, я бы определенно заткнул перфекционизм и пошел с:
▶ parsed =~ /\A%/ ? '' : parsed
Надеюсь, поможет.