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ájdeniepostName=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)