Разобрать параметры URL с символами «&» без «=» после - PullRequest
4 голосов
/ 13 мая 2019

У меня есть следующий код, поэтому я могу получить параметры из URL.

Однако один из параметров имеет знак & в тексте, что приводит к тексту после его обрезания.как заставить знак & отображаться с соответствующим текстом после него?

function getUrlVars() {
    var vars = {};
    var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi,    
    function(m,key,value) {
      vars[key] = value;
    });
    return vars;
  }

 var cmp = getUrlVars()["cmp"];
    document.getElementById("currentMemberPackage").value = cmp;
    var replaced = cmp.replace(/%20/g, " "); 

Пример URL = ?Club%20Plus%20Health%20&%20Fitness (я не могу изменить это, поскольку в данных, которые выдвигаются, есть &через URL)

Отображается: Club Plus Health

Должно быть: Club Plus Health & Fitness

Ответы [ 3 ]

2 голосов
/ 13 мая 2019
  1. Сервер ДОЛЖЕН отправить %26 вместо недействительного &. Тот, кто сгенерировал URL, должен исправить его на стороне сервера.
  2. Ваша функция может быть заменена на полезную URLSearchParams

var url = "?cmp=Club%20Plus%20Health%20%26%20Fitness"

var cmp = new URLSearchParams(url).get("cmp");
console.log(cmp)

Альтернатива, если вы не можете остановить отправку инвалида и его отправку.
Убедитесь, что вы не слепо конвертируете & в% 26, иначе вы можете взломать код, если существует более одного параметра:

var url = "?someparm=a&cmp=Club%20Plus%20Health%20&%20Fitness"
           .replace(/&%20/g,"%26 "); // add the space!

var cmp = new URLSearchParams(url).get("cmp");
console.log(cmp)
2 голосов
/ 13 мая 2019

Это ошибка на стороне поставщика данных, пожалуйста, сообщите поставщику данных, как это должно быть исправлено.

Существует способ извлечь значения на 100% правильно, если вы знаете все возможные значения ключа, а их не слишком много. В этом случае регулярное выражение может выглядеть как

new RegExp("[?&]+([^=&]+)=(.*?)(?=&(?:" + your_keys.map(function(x) {return x.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');}).join("|") + ")=|$)", "gi")

Существует хрупкий общий, не 100% обходной путь, например

/[?&]+([^=&]+)=(.*?)(?=&[^=&]+=|$)/gi

См. это демонстрационное регулярное выражение . Вы можете использовать его до тех пор, пока поставщик данных не решит проблему, и вы не будете знать все возможные ключи.

Детали

  • [?&]+ - 1 или более ? или & символов
  • ([^=&]+) - Группа 1: один или несколько символов, отличных от = и &
  • = - знак равенства
  • (.*?) - Группа 2: любые 0+ символов, кроме символов разрыва строки, как можно меньше
  • (?=&[^=&]+=|$) - с последующим &, одним или несколькими символами, отличными от = и &, а затем = или концом строки.
2 голосов
/ 13 мая 2019

& в URI - это специальный символ - вам придется URL, чтобы закодировать его.Используйте encodeURIComponent, чтобы сделать это автоматически:

const str = "Club Plus Health & Fitness";
const encoded = encodeURIComponent(str);
console.log(encoded);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...