使用正则表达式在JavaScript中从URL中删除utm_*参数

3

我没有找到任何好的答案来回答这个问题,所以我分享一下我发现并且可行的方法

如果你想从一个URL中删除所有的Google Analytics术语,你大多数情况下希望保留其他参数,并最终得到一个干净有效的URL

url = url.replace(/(\&|\?)utm([_a-z0-9=+\-]+)/igm, "$1");

使用这样的url https://www.somewebsite.fr/produit/yi-camera-3600-noir-vr-33705370/offre-81085802?utm_source=325483&utm_medium=affiliation&utm_content=catalogue-RDC&awc=6901_1530705916_88ef12642ad61dfc5239ba01bbbe5249 你会得到这个 https://www.somewebsite.fr/produit/yi-camera-3600-noir-vr-33705370/offre-81085802?&&&awc=6901_1530705916_88ef12642ad61dfc5239ba01bbbe5249 这个url已经是有效的,但我们有一些重复的 & 符号。如果你从第一个请求中删除$1,你将只得到一个 & 符号而不是应该在开头的?。
因此,下一步的清理是保留第一个?符号 => $1 并删除其他前导 & 符号。
url = url.replace(/(\?)\&+/igm, "$1");

这里有一个干净漂亮的URL。
完整版本:
url = url.replace(/(\&|\?)utm([_a-z0-9=+\-]+)/igm, "$1");
url = url.replace(/(\?)\&+/igm, "$1");

如果你能找到一行代码,那就太好了。
编辑:生成的URL应该是这个:https://www.somewebsite.fr/produit/yi-camera-3600-noir-vr-33705370/offre-81085802?awc=6901_1530705916_88ef12642ad61dfc5239ba01bbbe5249

最终的正确URL将是什么? - undefined
好的,我已经编辑了我的问题。 - undefined
@benraay /(?<=&|\?)utm_.*?(&|$)/igm 如果查询字符串只包含 utm 参数,则不会删除尾部的 ?。它也无法在不支持 ECMAScript 2018 标准的 JS 环境中移植。 - undefined
2个回答

7
我认为它可能很简单: url = url.replace(/(?<=&|\?)utm_.*?(&|$)/igm, ""); 你不需要转义& (?<=&|\?) = 正向先行断言 .*? = 除“非贪婪模式”以外的所有内容

非常好,参数值更强大!谢谢。 - undefined
1
请注意,此正则表达式中包含一个只在ECMAScript 2018兼容的JavaScript环境中支持的lookbehind。另外,如果查询字符串只包含utm参数,则不会删除末尾的?。请参阅此演示https://www.somewebsite.fr/produit/yi-camera-3600-noir-vr-33705370/offre-81085802?utm=6901_1530705916_88ef12642ad61dfc5239ba01bbbe5249&utm=ewe 最终会变成 https://www.somewebsite.fr/produit/yi-camera-3600-noir-vr-33705370/offre-81085802? - undefined
我真的不知道我需要的是Node.js 8版本,但它在那个版本上运行得很好。 - undefined
@benraay 你的意思是你认为将 https://www.some.fr/812?utm=6901&utm=ewe 转换成 https://www.some.fr/812? 是可以的吗? - undefined
@benraay 好的,我想我误解了目标。你说 https://www.some.fr/812?&&aws=true 已经可以了,而我以为你希望尽可能地得到一个看起来更整洁的模式。 - undefined
@WiktorStribiżew 是的,第一个已经可以了,目的是在清理之后从该页面上抓取信息,但是URL对人们可见,"?&&&"有点丑陋,末尾的一个问号看起来还可以。 - undefined

3
您可以使用一个适用于所有 JS 版本的单个正则表达式,它将

  • 匹配并捕获后面跟着一个或多个utm参数的?,然后跟随一个不是utm的参数,并用$1替换以恢复这个?,因为它是必要的
  • 或者,在查询字符串中匹配任何具有1个或多个utm参数且不存在除utm之外的参数的?(因此,$1将为空,并且?将被删除)
  • 或,仅匹配所有的utm参数以删除它们。

该正则表达式看起来像:

.replace(/(\?)utm[^&]*(?:&utm[^&]*)*&(?=(?!utm[^\s&=]*=)[^\s&=]+=)|\?utm[^&]*(?:&utm[^&]*)*$|&utm[^&]*/gi, '$1')

请查看正则表达式演示,详情请点击 此链接 细节说明
  • (\?)utm[^&]*(?:&utm[^&]*)*&(?=(?!utm[^\s&=]*=)[^\s&=]+=) - 匹配 ?utm(捕获组内带有 ? 并以 $1 引用),后跟 0 个或多个非 & 字符,然后是零个或多个 &utm,随后跟零个或多个非空格、&= 字符,再接一个不是 utm 参数的 =,最后是 &
  • | - 或
  • \?utm[^&]*(?:&utm[^&]*)*$ - 匹配 ?utm,后跟 0 个或多个非 & 字符,然后是零个或多个 &utm,并以字符串结尾
  • | - 或
  • &utm[^&]* - 匹配 &,后跟 utm,然后是0个或多个非 & 字符
JS演示:

var urls = ['https://www.somewebsite.fr/produit/yi-camera-3600-noir-vr-33705370/offre-81085802?utm_source=325483&utm_medium=affiliation&utm_content=catalogue-RDC&awc=6901_1530705916_88ef12642ad61dfc5239ba01bbbe5249', 'https://www.somewebsite.fr/produit/yi-camera-3600-noir-vr-33705370/offre-81085802?t=55&utm_source=325483&utm_medium=affiliation&utm_content=catalogue-RDC&awc=6901_1530705916_88ef12642ad61dfc5239ba01bbbe5249','https://www.somewebsite.fr/produit/yi-camera-3600-noir-vr-33705370/offre-81085802?awc=6901_1530705916_88ef12642ad61dfc5239ba01bbbe5249&utm_tt=78', 'https://www.somewebsite.fr/produit/yi-camera-3600-noir-vr-33705370/offre-81085802?utm=6901_1530705916_88ef12642ad61dfc5239ba01bbbe5249&utm=ewe'];

var u = 'utm[^&]*';
var rx = new RegExp("(\\?)"+u+"(?:&"+u+")*&(?=(?!utm[^\s&=]*=)[^\s&=]+=)|\\?"+u+"(?:&"+u+")*$|&"+u, "ig");
for (var url of urls) {
  console.log(url, "=>", url.replace(rx, '$1'));
}


真的是一个非常好而且详细的解决方案,但可读性有点差,我更喜欢我的前两行版本,更容易理解。 - undefined
1
@benraay 可能会失去可读性,但它涵盖了所有可能的情况,并展示了如何动态构建模式。该解决方案可以根据需要轻松删除其他参数,并且可以与不支持后顾断言的正则表达式库一起使用,例如不支持 ECMAScript 2018 标准的 VBA 或 JS 版本。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接