Удалить аргумент запроса из URL в JavaScript - PullRequest
4 голосов
/ 01 января 2012

Я пытаюсь написать функцию, которая удалит аргумент запроса из 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;
}

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

Спасибо!

Ответы [ 2 ]

3 голосов
/ 01 января 2012

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

2 голосов
/ 01 января 2012

Учитывая кодированный в процентах 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...