javascript regex - удалить переменную строки запроса, если она есть - PullRequest
0 голосов
/ 05 сентября 2010

Мне нужно переписать запрос с использованием JavaScript. Сначала я проверяю, присутствует ли переменная, и хочу ли я заменить ее новым поисковым термином. Если его нет, я просто добавляю новую переменную

Я могу заставить его работать с простыми терминами, такими как hat, ufc hat пробелы% 20, так что UFC Hat действительно UFC% 20HAT

У меня возникли проблемы с такими терминами, как макияж, шляпный мяч, кофе, чай и т. Д.

Какое регулярное выражение для этого?

Ниже мой код, который не работает.

var url = String(document.location).split('?');
querystring = url[1];
if(querystring.match(/gbn_keywords=/)!=null)
querystring=querystring.replace(/gbn_keywords=[a-zA-Z0-9%20.]+/,"gbn_keywords="+term);
else
querystring=querystring+"&gbn_keywords="+term;

Ответы [ 4 ]

1 голос
/ 05 сентября 2010

location объекты уже имеют совершенно хорошие свойства, такие как pathname, hostname и т. Д., Которые дают вам отдельные части URL. Используйте свойство .search вместо попытки взломать URL-адрес как строку (? может появляться не только в этом месте).

В этом случае происходит разделение на символ & (и, возможно, ;, если вы хотите быть хорошим, как в HTML4 B2.2), и проверка каждого параметра на соответствие искомому. В общем случае это требует правильного декодирования URL, так как g%62n_keywords=... является допустимым способом написания того же параметра. На выходе, естественно, вам нужно будет снова кодировать, чтобы прекратить & переход к следующему параметру (а также включить другие недопустимые символы).

Вот пара служебных функций, которые вы можете использовать для более удобного управления строкой запроса. Они преобразуются между строкой ?..., как видно из location.search или link.search, и поиском Object, отображающим имена параметров в массивы значений (поскольку запросы в кодировке формы могут иметь несколько экземпляров одного и того же параметра).

function queryToLookup(query) {
    var lookup= {};
    var params= query.slice(1).split(/[&;]/);
    for (var i= 0; i<params.length; i++) {
        var ix= params[i].indexOf('=');
        if (ix!==-1) {
            var name= decodeURIComponent(params[i].slice(0, ix));
            var value= decodeURIComponent(params[i].slice(ix+1));
            if (!(name in lookup))
                lookup[name]= [];
            lookup[name].push(value);
        }
    }
    return lookup;
}

function lookupToQuery(lookup) {
    var params= [];
    for (var name in lookup)
        for (var i= 0; i<lookup[name].length; i++)
            params.push(encodeURIComponent(name)+'='+encodeURIComponent(lookup[name][i]));
    return params.length===0? '' : '?'+params.join('&');
}

Это упрощает использование:

var lookup= queryToLookup(location.search);
lookup['gbn_keywords']= ['coffee & tea'];
var query= lookupToQuery(lookup);
1 голос
/ 05 сентября 2010

Регулярное выражение не требуется.Чтобы получить аргументы запроса, возьмите все после ?.Затем разделите строку на &, чтобы получить каждый аргумент.Снова разделите на =, чтобы получить имя аргумента (справа от =) и значение (слева от =).Перебирайте каждый аргумент, перестраивайте URL с каждым аргументом, исключая тот, который вам не нужен.Вы не должны сталкиваться с проблемами здесь, потому что ?, & и - должны быть экранированы, если они должны использоваться в аргументах.Вы также сказали, что хотите добавить аргумент, если он не существует, поэтому просто установите для переменной значение true, пока вы будете перебирать каждый аргумент, если найдете аргумент.Если вы не добавили его в конец строки запроса, которую вы перестроили.

0 голосов
/ 05 сентября 2010
Символ

& используется для разделения пар ключ и значение в строке запроса.Чтобы вы могли сопоставить все символы, кроме &, переписав свой код следующим образом:

querystring=querystring.replace(/gbn_keywords=[^&]+/,"gbn_keywords="+term);

[^ &] + соответствует одному или нескольким символам до & или конца строки.Но если могут возникнуть ситуации, когда данные строки запроса могут выглядеть следующим образом:регулярное выражение будет соответствовать 0 или более символов.Я думаю, что это лучше.

0 голосов
/ 05 сентября 2010

Почему бы вам не выполнить разделение на url[1] и чем заменить значение gbn_keywords в этом новом массиве?

И если вы используете JavaScript Framework, может быть полезная функцияэто делает все это.В Prototype есть функция toQueryParams () .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...