Как лучше всего валидировать url по шаблонам, содержащим регулярки подобного вида:
/item/:id(\d+)
Причем необходимо выдергивать название переменной из шаблона (id) и присваивать ей соответствующее значение. Был бы благодарен за примеры кода.
Вот как бы я реализовал подобное "по быстрому" и "на коленке":
<script>
/* Функция */
function matchUrl(pattern, url) {
/* Делим паттерн и ссылку на сегменты */
var patternArray = pattern.split('/');
var urlArray = url.split('/');
/* Cравниваем количество сегментов */
if (patternArray.length === urlArray.length) {
var vars = {}; // Объект, возвращяемый в случае наличия в url переменных
/* Перебираем все сегменты паттерна */
for (var i = 0; i < patternArray.length; i++) {
/* Если сегмент - переменная с регуляркой */
if (patternArray[i].substring(0, 1) === ':') {
var start = patternArray[i].indexOf('(');
var end = patternArray[i].indexOf(')');
/* Пишем переменную и значение в возвращаемый объект */
vars[patternArray[i].substring(1, start)] = urlArray[i];
/* Выцепляем регулярку */
var reg = patternArray[i].substring(start+1, end);
/* Проверяем соответствие */
if (RegExp(`^${reg}$`).test(urlArray[i]) === false) {
return false;
}
} else {
/* Если сегмент - не переменная с регуляркой, то просто сравниваем */
if (patternArray[i] !== urlArray[i]) {
return false;
}
}
}
/* Если в ссылке были переменные, то возвращаем объект с ними, если нет, то просто true */
if (Object.keys(vars).length === 0) {
return true;
} else {
return vars;
}
} else {
return false;
}
}
/* Функция */
/* Пример */
var pattern = String.raw`/item/:id(\d+)`;
var url = '/item/123';
console.log(matchUrl(pattern, url));
/* Пример */
</script>
Сборка персонального компьютера от Artline: умный выбор для современных пользователей