Создать маску из регулярного выражения
Есть форма в которой пользователь может ввести например номер авто как целиком А333АА123, так и его часть, т.е. А33 или А333АА. Форма оправляется на бекенд и данный номер может быть там сохранен, как ЧАСТИЧНО так и ЦЕЛИКОМ. Как на бекенде средствами регулярок и php проверить, что пользователь вводит данные правильно? Т.е. регулярка равна /^[А-Я]{1}[0-9]{3}[А-Я]{2}[0-9]{3}$/ (упрощена для понимания), но как проверить, что например A33 проходит по данному шаблону?
Ответы (2 шт):
Автор решения: Wiktor Stribiżew
→ Ссылка
В упрощённом виде регулярное выражение будет выглядеть так:
/^[А-Я](?:[0-9]{0,3}(?:(?<=[0-9]{3})[А-Я]{1,2}(?:(?<=[А-Я]{2})[0-9]{0,3})?)?)?$/
Подробности:
^- начало строки[А-Я]- одна буква(?:- начало первой необязательной подмаски:[0-9]{0,3}- от нуля до трёх цифр(?:- начало второй необязательной подмаски:(?<=[0-9]{3})[А-Я]{1,2}- одна-две буквы, перед которыми должно быть три цифры(?:(?<=[А-Я]{2})[0-9]{0,3})?- третья необязательная подмаска: от нуля до трёх цифр, перед которыми должны быть 2 буквы
)?- конец второй подмаски
)?- конец первой подмаски$- конец строки.
Автор решения: vp_arth
→ Ссылка
Для проверки части маски можно просто наложить строку на валидный паттерн
const r = /^[А-Я]{1}[0-9]{3}[А-Я]{2}[0-9]{3}$/u;
const pattern = 'Я000ЯЯ000';
const check = s => r.test(s+pattern.slice(s.length));
[
'ББ12',
'И7'
].forEach(s => console.log(s, check(s)));
На php то же самое написать несложно.