Autor Zpráva
Sylar
Profil
Zdravím,
pokouším se z url smazat parametry z ppc kampaní "&utm_něco=NĚCO" a případně hash "#něco". Mám vytvořený takovýto regulár, ale nedaří se mi jej rozběhat.

Regulár a jeho použití:

url = new RegExp("([\?|\&]utm_[a-z]+=[\w-]+)?(\#[\w]+)?", "i");
window.location.href.replace(url, "");

Z této url http://www.eshop.cz/obchodni-podminky/?utm_source=abc&utm_medium=def&utm_term=ghi&normal-parameter=abc&utm_content=jkl&utm_campaign=wxz#text, by se mělo ponechat pouze http://www.eshop.cz/obchodni-podminky/?normal-parameter=abc .

Můžete mě prosím nasměrovat, kde je v reguláru chybka?
Joker
Profil
Sylar:
Nejsem si úplně jistý, ale potíž je nejspíš v tom, že tomu výrazu vyhoví i prázdný řetězec.
Když se [\?|\&] dá před první závorku, částečně to funguje.

Úplně to nebude fungovat, protože to nahradí jen první výskyt, čili výsledkem bude: http://www.eshop.cz/obchodni-podminky/&utm_medium=def&utm_term=ghi&normal-parameter=abc&utm_content=jkl&utm_campaign=wxz#text - což je jako URL ještě navíc špatně.

Sestavit regulární výraz, který by udělal všechna ta nahrazení a zároveň nenahradil to co nahradit nemá, asi nepůjde.
Další problém je, že to není zas tak jednoduché, jako pouze odmazat část URL, viz ukázka výše.

Snazší by asi bylo to udělat přes normální řetězcové operace:
Hash jde snadno, stačí vzít jen podřetězec do prvního #.
Pak řetězec rozdělit na část před otazníkem a zbytek. Zbytek rozsekat podle ampersandů do pole. Následně projít to pole a smazat všechny položky, které začínají "utm_".
A na závěr zase zbylé prvky v poli spojit ampersandy do řetězce a ten připojit otazníkem k první části URL.
Sylar
Profil
Joker:
díky, to vyhození [\?|\&] před závorku bylo to hlavní. Teďka jsem ještě trochu googlil a zkoušel pokus-omyl a vypadá to, že tohle funguje:

window.location.href.replace(new RegExp("[\?|\&]utm_[a-z]+=[a-z]+(#.+)?", "g"), "").replace(new RegExp("\\??&", ""), "?");

Možná tam ale nevidím ještě nějaké možnosti, které by mohly přijít v jiných typech url a které by regulár výše nezachytil.
Jan Kupka
Profil
Sylar:

Ahoj, a co třeba URL, kde bude:

utm_whatever=abc_def
normal-parameter=abc#def
utm_whatever#

Jinak v hranatých závorkách nemusíš znaky ? a & escapovat, nemají tam žádný speciální význam. Pokud v hranatých závorkách použiješ zápis [?|&], neznamená to "otazník nebo ampersand" ale "otazník nebo pipe symbol nebo ampersand". Stačí [?&] nebo (?:\?|&).
Sylar
Profil
Jan Kupka:
zkusil jsem tedy ještě regulár upravit, ale url "normal-parameter=abc#def" se mi nepodařilo vyřešit (asi to jedním regulárem ani nejde), takže jsem přidal ještě další a takovéto obludné url ?&UTm_source=abc-def&test2=def_DD-D&utm_medium=def_DEF&utm_term=&utm_content=jkl&test=&utm_campaign=sadf&normal-test=asd#sadf změní na ?test2=def_DD-D&test=&normal-test=asd

window.location.href.replace(new RegExp("[?&]utm_[a-z\-]+=?[_a-z\-]*", "gi"), "") // odstranění utm_něco parametrů
                                 .replace(new RegExp("\\??&+", ""), "?") // změna prvního & na ? (je-li), případně odstranění více & za sebou
                                 .replace(new RegExp("\\?$", ""), "") // zbyl-li nám v url pouze otazník, odstraníme i ten (toto by se možná dalo nějak spojit s řádkem nad, ale nevím jak)
                                 .replace(location.hash, ""); // a konečně oříznutí hashe

Jedinou otázkou zůstává není-li už za takkovéhoto stavu opravdu jednodudší, spolehlivější a hlavně rychlejší způsob ten co psal [#2] Joker :)
Jan Kupka
Profil
Sylar:

No, je to trochu pakárna :) To "?&" na začátku query stringu předpokládám je překlep. Asi bych to vyřešil nějak takhle:

var winLoc = window.location,
    cleanURL = winLoc.protocol + '//' + winLoc.hostname + winLoc.pathname + (winLoc.search && winLoc.search.replace(/[?&]utm_[^&]+/gi, '').replace(/^&/, '?'));

Je dost možné, že to jde i líp, ale tohle by mělo fungovat. Samozřejmě to předpokládá, že "chtěné" parametry v URL nezačínají "utm_".

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: