2015-07-26 3 views
1

Мне нужно использовать регулярные выражения для замены или добавления запроса к URL-адресу с помощью функции adjustUrlParameter (url, param). Если такой же запрос существует в URL-адресе, он должен заменить запрос параметром (то есть ID = 501 должен заменить ID = 200 на google.com?ID=200). Если запрос не существует, он должен просто добавить запрос в конец URL-адреса. Наконец, если запрос существует, но другого типа, он должен добавить запрос и отделить его от существующего запроса с помощью «&». Вот пример:Как заменить параметр запроса в URL с помощью Regex?

adjustUrlParameter('google.com?ID=501', 'TYPE=444') // => 'google.com?ID=501&TYPE=444' 

Мой код не заменяет тот же тип запроса. Он возвращает 'google.com?ID=501 & ID = 200' вместо того, чтобы возвращать 'google.com?ID=200'. Вот мой код:

var adjustUrlParameter = function(url, param) { 
    var urlQuery = url.match(/\w+\W+/g); 
    for (var i = 0; i < urlQuery.length; i++) { 
    if (param === urlQuery[i]) { 
     return url.replace(/\?.+$/, '?' + param); 
    } 
    } 

    if (url.match(/\?/)) { 
    return url + "&" + param; 
    } else { 
    return url + "?" + param; 
    } 

}; 

Как получить adjustUrlParameter ('google.com?ID=501', 'ID = 201'), чтобы вернуть правильный результат ('google.com?ID=201')?

ответ

1

Проблема в том, что оператор if никогда не возвращает true. Поместите некоторые console.logs в цикл for и посмотрите его. Вы увидите, когда urlQuery [i] вернет параметр «ID =», возвращает «ID = 444». Они не равны.

console.log("parameter:"+param); //parameter:ID=444 
console.log("url_query: "+urlQuery[i]); //url_query: ID= 

Если вы меняете цикл, как показано ниже заменяет параметр запроса с тем же типом:

for (var i = 0; i < urlQuery.length; i++) { 
    console.log("parameter:"+param); 
    console.log("url_query: "+urlQuery[i]); 
    var paramType = param.split("="); 
    console.log("paramType"+paramType); 
    var tmp = paramType[0]+"="; //since urlQuery[i] always has a character at the end 
    console.log(tmp); 
    if (tmp === urlQuery[i]) { 
     return url.replace(/\?.+$/, '?' + param); 
    } 
    } 

При запуске adjustUrlParameter('google.com?ID=501', 'ID=444') выход является "google.com?ID=444"

0

Вы хотите сравнить имена запросов, а не значения, которые они содержат. Скажите, что вы проходите в id=200 как param, вы хотите найти и заменить от id в существующих url. Это означает, что мы не заботимся о значении id. Если это так, мы можем разделить на ? или &, чтобы получить список всех запросов. Мы начинаем цикл с 2, так как 0 и 1 являются базовыми url и ?. Мы также прыгаем 2 с каждой итерацией, чтобы пропустить предыдущие &. Наконец, мы обязательно разделим каждый query на = и используем [0] или в первом тайме, чтобы получить то имя, о котором мы заботимся.

Вы могли бы сделать что-то вроде этого:

var adjustUrlParameter = function(url, param) { 
    var urlQuery = url.split(/(\?|\&)/) 
    , thisQuery = param.split(/\=/)[0] 
    for (var i = 2; i < urlQuery.length; i = i + 2) { 
     if (thisQuery === urlQuery[i].split(/\=/)[0]) { 
      return url.replace(/(\?|\&).*$/, '?' + param); 
     } 
    } 

    if (url.match(/\?/)) { 
     return url + "&" + param; 
    } else { 
     return url + "?" + param; 
    } 

}; 
Смежные вопросы