Вставка параметра в строку запроса URL-адреса, если она еще не присутствует, с чистой заменой регулярного выражения - PullRequest
0 голосов
/ 18 декабря 2018

Я хочу добавить параметр с &show_pinned_search=1 или ?show_pinned_search=1 в строку ur, если она еще не существует.Я могу добавить параметр show_pinned_search=1, если он еще не существует, используя подход с отрицательным взглядом , такой как (?!show_pinned_search=1), но возникают трудности с выбором предыдущего символа & или ?.Демонстрация тестирования: https://regex101.com/r/aNccK6/1

Пример ввода:

https://www.example.com/property/villa-alexia/BC-1414?tes=dfgdf&fcb=5&show_pinned_search=1
http://www.example.com/property/hyat-doral/HA-4509801?show_pinned_search=1
https://www.example.com/property/villa-alexia/BC-1414?tes=dfgdf&fcb=5
http://www.example.com/property/hyat-doral/HA-4509801
http://www.example.com/property/hyat-doral/HA-4509801?show_pinned_search=1
https://www.example.com/property/villa-alexia/BC-1414?tes=dfgdf&fcb=5

Ожидаемый результат:

https://www.example.com/property/villa-alexia/BC-1414?tes=dfgdf&fcb=5&show_pinned_search=1
http://www.example.com/property/hyat-doral/HA-4509801?show_pinned_search=1
https://www.example.com/property/villa-alexia/BC-1414?tes=dfgdf&fcb=5&show_pinned_search=1
http://www.example.com/property/hyat-doral/HA-4509801?show_pinned_search=1
http://www.example.com/property/hyat-doral/HA-4509801?show_pinned_search=1
https://www.example.com/property/villa-alexia/BC-1414?tes=dfgdf&fcb=5&show_pinned_search=1

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Это регулярное выражение проверяет, есть ли у вас возможность вставлять запись show_pinned_search=1:

^([^?]+)(?:\??)(?!(?:.*)&?show_pinned_search=1(?:&.*)?$)(.*)$

Шаг за шагом:

  • ([^?]+)(?:\??): сопоставить первую часть URL с вопросительным знаком ?, если есть.Захватывается только та часть, которая находится перед возможным вопросительным знаком (идентификатор группы $1).
  • (?!(?:.*)&?show_pinned_search=1(?:&.*)?$): посмотрите вперед, чтобы убедиться, что show_pinned_search=1 в ведущей части URL
  • (.*): получить ведущую часть (у которой, конечно, нет show_pinned_search=1 вхождений) и захватить ее (идентификатор группы $2).

Затем перейдите к этой замене:

$1?show_pinned_search=1&$2

Хитрость заключается в том, чтобы вставить show_pinned_search=1 сразу после знака вопроса , так что вам не нужно беспокоиться, если есть вопросительный знак или амперсанд & раньше.

Небольшой недостаток здесь заключается в том, что вы можете получить ведущий амперсанд в вашей строке, если URL не 't end имеет ведущую часть параметра или заканчивается знаком вопроса.Однако это не имеет большого значения .

Рабочая скрипка Regexp101.com .

0 голосов
/ 18 декабря 2018

Это один из способов сделать это

Здесь идея в первую очередь проверить, включает ли тестовая строка шаблон, который мы тестируем.если это так, то мы ничего не меняем, если нет, то мы ищем последний индекс & и ?.какой бы индекс ни был выше, мы добавляем этот специальный символ вместе с show_pinned_search=1

let arr = [`https://www.example.com/property/villa-alexia/BC-1414?tes=dfgdf&fcb=5&show_pinned_search=1`,

`http://www.example.com/property/hyat-doral/HA-4509801?show_pinned_search=1`,

`https://www.example.com/property/villa-alexia/BC-1414?tes=dfgdf&fcb=5`,

`http://www.example.com/property/hyat-doral/HA-4509801`,

`http://www.example.com/property/hyat-doral/HA-4509801?show_pinned_search=1`,

`https://www.example.com/property/villa-alexia/BC-1414?tes=dfgdf&fcb=5`,
];

let op = arr.map(e=>{
  let temp = e.match(/(\?|&)show_pinned_search=1/); 
  let ampIndex = e.lastIndexOf('&');
  let quesIndex = e.lastIndexOf('?');
  if(temp) return e;
  else return ampIndex > quesIndex ? e+'&show_pinned_search=1' : e+`?show_pinned_search=1`
})

console.log(op);
...