javascript - Prečo sa parameter URL, ktorý chcem získať, nezobrazuje úplne?


Sledujem URL adresy s parametrami "posName" ako:

example.com?posName=Obsahový+&+Community+Manažér+(M/Ž)

Ale môj kód vracia iba "Obsah":

function () {
    var uri = document.location.href;
    var uri_dec = decodeURIComponent(uri);
    var url = new URL(uri_dec);
    var posName= url.searchParams.get("posName");
    return posName;
}

Ako môžem získať celý parameter?

ÚPRAVA: Mám ďalšiu URL ako:

exemple.com?posName=Klub+&+Animátor+(M/Ž)

A kód vracia celý parameter... Takže je to dĺžka parametra, ktorá spôsobuje tento problém?

Odpoveď č. 1

Upravil som vašu funkciu tak, aby prijímala URI ako argument. Parameter je potrebné zakódovať pred jeho pripojením k reťazcu dopytu (tento kód tu nevidíme). Funkcia decodeURIComponent vo vašej funkcii tiež nie je potrebná.

function getPosName (URI) {
    //var uri_dec = decodeURIComponent(uri);
    var url = new URL(URI);
    var posName = url.searchParams.get("posName");
  return posName;
}

console.log("Using your current URI:", getPosName("http://exemple.com?posName=Content+&+Community+Manager+(H/F)"))

const encodedParam = encodeURIComponent("Content & Community Manager (H/F)")
console.log("Encoded Parameter:", encodedParam)
const wellFormedURI = `http://exemple.com?posName=${encodedParam}`
console.log("Well Formed URI:", wellFormedURI)
console.log("Using well formed URI:", getPosName(wellFormedURI))

Odpoveď č. 2

Ak z nejakého dôvodu nemáte kontrolu nad tým, čo je v window.location.href, môžete to celkom jednoducho vyriešiť pomocou regulárneho výrazu:

function getPosName(uri) {
    let match = uri.match(/(?<=posName=)(.+?)(?=\&\w+?\=|$)/); 
    return match[1]; 
}

console.log(getPosName( "xemple.com?posName=Content+&+Community+Manager+(H/F)")); //Content+&+Community+Manager+(H/F)
console.log(getPosName( "exemple.com?posName=Club+&+Animator+(H/F)")); //Club+&+Animator+(H/F)
console.log(getPosName( "exemple.com?posName=Club+&+Animator+(H/F)&test=1")); // Club+&+Animator+(H/F)

Vysvetlenie regulárneho výrazu:

(?=postName=) lookbehind na nájdenie postName= na začatie zhody

(.+?) zodpovedá čomukoľvek až po nižšie uvedený lookahead vzor

(?=\&\w+?\=|$) vzor lookahead pre doslovný & nasledovaný nejakým textom ľubovoľnej dĺžky od 1 po n \w+? nasledovaný =. To všetko, alebo sme na konci vstupného reťazca, označeného $

Aktualizácia

Regex lookbehind je relatívne nový. Ak prehliadač alebo aplikácia nepodporuje regex lookbehind (napr. Google Tag Manager momentálne), skúste namiesto toho tento obchádzkový postup:

function getPosName(uri) {
    let match = uri.match(/posName=(.+?)(?=\&\w+?\=|$)/);
    return match[1];
}

console.log(getPosName( "xemple.com?posName=Content+&+Community+Manager+(H/F)")); //Content+&+Community+Manager+(H/F)
console.log(getPosName( "exemple.com?posName=Club+&+Animator+(H/F)")); //Club+&+Animator+(H/F)
console.log(getPosName( "exemple.com?posName=Club+&+Animator+(H/F)&test=1")); // Club+&+Animator+(H/F)