2012-01-01 1 views
4

Я пытаюсь написать функцию, которая удалит аргумент запроса из URL-адреса в javascript. Я думаю, что я использую регулярное выражение, но я не уверен, что я что-то пропустил. Кроме того, я не могу поколебать ощущение, что, вероятно, был лучший способ сделать это, что не включало меня во все время с регулярным выражением, и рискуя позже узнать, что я не взял какой-то угол с учетом случая.Удалить аргумент запроса из URL-адреса в javascript

remove_query_argument = function(url, arg){ 

    var query_arg_regex; 

    // Remove occurences that come after '&' symbols and not the first one after the '?' 
    query_arg_regex = new RegExp('&' + arg + '=[^(?:&|$)]*', 'ig'); 
    url = url.replace(query_arg_regex, ''); 

    // remove the instance that the argument to remove is the first one 
    query_arg_regex = new RegExp('[?]' + arg + '[^(?:&|$)]*(&?)', 'i'); 
    url = url.replace(query_arg_regex, function (match, capture) { 
     if(capture != '&'){ 
      return ''; 
     }else{ 
      return '?' 
     } 

    }); 

    return url; 
} 

У кого-нибудь есть проблемы с этим кодом или вы хотели бы предложить лучшую реализацию или способ решения этой проблемы?

Спасибо!

+0

это было бы лучше, если я думаю - http://codereview.stackexchange.com/ – emaillenin

ответ

3

Если у вас есть много операций URL связанных , вам лучше попробовать эту потрясающую библиотеку js https://github.com/medialize/URI.js

+0

Да, похоже я бы сэкономил мне массу времени: http://medialize.github.com/URI.js/docs.html#search-remove –

2

Учитывая percent-encoded URL, следующая функция удалит пар поля значение из строки запроса:

var removeQueryFields = function (url) { 
    var fields = [].slice.call(arguments, 1).join('|'), 
     parts = url.split(new RegExp('[&?](' + fields + ')=[^&]*')), 
     length = parts.length - 1; 
    return parts[0] + '?' + (length ? parts[length].slice(1) : ''); 
} 

Некоторые примеры:

var string = 'http://server/path/program?f1=v1&f2=v2'; 
removeQueryFields(string, 'f1');  // 'http://server/path/program?f2=v2' 
removeQueryFields(string, 'f2');  // 'http://server/path/program?f1=v1' 
removeQueryFields(string, 'f1', 'f2'); // 'http://server/path/program' 
+1

Это упадет любой фрагмент URL-адреса при удалении последнего параметра. –

+0

Потому что его RegExp ошибочен, он не работает, когда есть пустой параметр значения. Я использовал этот скрипт и исправил его, когда понял, что он не работает: новый RegExp ('[&?] (' + Fields + ') =. * [^ &]. *')) – aleation