2015-09-08 2 views
0

Я пытаюсь удалить переменную из строки запроса. Это мой текущий подход:JavaScript regex для удаления переменной из запроса

var str = "http://example.com/tal.php?sec=16&name=xxxx&size=xxxx"; 
str = str.replace(/([&])name=.*?(&|$)/g,""); 

Есть две проблемы с этим кодом:

  • И & в начале названия и в конце удаляются. Я хотел бы удалить только один из них

  • Он также должен работать, когда имя переменной находится в начале или в конце строки запроса.

Как я могу сказать, регулярное выражение, чтобы удалить второй & только если она соответствует первым?

ответ

2

Я предлагаю использовать захват группы, а затем использовать их в функции обратного вызова, чтобы повторно вставить & характер соответствующим образом:

([?&])name=.*?($|&) 

Посмотреть demo

Вот является JavaScript фрагмент кода, показывающий процесс замены во всех 3 позиции:

function removeQueryArg(str) { 
 
    var re = /([?&])name=.*?($|&)/; 
 
    return str.replace(re, function(m, grp1, grp2, offset, input) { 
 
    return grp1 === "?" ? "?" : (grp2 === "&" ? "&" : ""); 
 
    }); 
 
} 
 

 
document.write(removeQueryArg('http://example.com/tal.php?name=xxxx&sec=16&size=xxxx') + "<br/>" + 
 
    removeQueryArg('http://example.com/tal.php?sec=16&name=xxxx&size=xxxx') + "<br/>" + 
 
    removeQueryArg('http://example.com/tal.php?sec=16&size=xxxx&name=xxxx'));

Поясню:

  • ([?&])name=.*?($|&) регулярное выражение содержит 2 группы, захватив ([?&]) (соответствие либо ? или &) и ($|&) (соответствующий конец строки или &).
  • Внутри метода replace мы можем передать содержимое этих групп функции обратного вызова, где мы можем дополнительно проанализировать, что делать с заменой.
  • function(m, grp1, grp2, offset, input) на самом деле использует весь матч m и grp1 и grp2 - это захваченные тексты. offset (индекс совпадения в исходной строке) и input (вся строка ввода) здесь не используются, но в какой-то день они могут оказаться полезными.
  • В обратном вызове я проверяю, равна ли группа 1 «?». Если да, аргумент находится в начале строки запроса, и нам нужно восстановить ? спереди.
  • Если нет, нам необходимо проверить содержимое 2-й группы. Если он равен &, совпадение находится в середине строки запроса, нам нужно добавить &. Если нет, мы в конце, ничего не добавляем, мы удаляем весь матч.

Подробнее см. В Specifying a function as a parameter at MDN replace method help page.

+0

Я сделал коррекцию, так как я не хочу, чтобы соответствовать первому, после этого изменения, если поместить переменную "?" как первый из querystring, он не подходит ... – Vandervals

+0

Правда, все это можно решить с помощью захвата групп и логики внутри функции обратного вызова. Проверьте обновленный ответ. –

+0

Выглядит хорошо, я не понимаю, что делает функция, которую вы даете, чтобы заменить ... – Vandervals

1

Простым способом решения этой проблемы является удаление параметра name вместе с вопросительным знаком или амперсандом, который предшествует ему. Если знак вопроса удаляется, верните его, заменив первый амперсанд вопросительным знаком.

s = s.replace(/([?&]name=[^&]*)/, ''); 
if (s.indexOf('?') == -1) { 
    s = s.replace(/[&]/, '?'); 
} 

Демонстрация:

function print(s) { 
 
    document.write(s + '<br \>'); 
 
} 
 

 
function deleteName(s) { 
 
    print(s); 
 
    s = s.replace(/([?&]name=[^&]*)/, ''); 
 
    if (s.indexOf('?') == -1) { 
 
    s = s.replace(/[&]/, '?'); 
 
    } 
 
    print(s); 
 
    print(''); 
 
} 
 

 
deleteName('http://example.com/tal.php?name=xxxx&sec=16&size=xxxx'); 
 

 
deleteName('http://example.com/tal.php?sec=16&name=xxxx&size=xxxx'); 
 

 
deleteName('http://example.com/tal.php?sec=16&size=xxxx&name=xxxx');
body { 
 
    font-family: sans-serif; 
 
}

+0

Да, в принципе, это похожее решение, но вместо 2 заменяет 2 регулярных выражения. –

+0

'
' является допустимым тегом. –

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