Валидация шаблонов url на JavaScript

300
01 августа 2017, 18:57

Как лучше всего валидировать 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>
READ ALSO
onerror event xhr js

onerror event xhr js

Доброе утроЧто должно произойти, чтобы сработал onerror xhr? Сервер иногда возвращает json данные с кодом 500, и согласно логике в этом случае должно...

293
Не выполняется gulpfile.babel.js

Не выполняется gulpfile.babel.js

Но получаю такой ответ:

286
Почему вместо PUT запроса отправляется OPTIONS?

Почему вместо PUT запроса отправляется OPTIONS?

У меня сначало было такая же ошибка с методом post, но я исправил таким образом

316
Ajax запрос зависает

Ajax запрос зависает

У меня есть форма регистрации, после ее заполнения и отправки начинает грузится ajax, то есть он заполняет бд, регестрируется, но ajax это не показывает,...

260