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

Removing utm_* parameters from URL in javascript with a regex

我没有找到这个问题的任何好的答案所以我分享我的发现和工作

如果您想从 URL 中删除所有 google 分析术语,您主要希望保留其他参数并在末尾获得干净有效的 URL

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

像这样的 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,您将只使用 & 符号而不是 ?你一开始就应该有

所以下一次清理我们保留第一个? sign => $1 并删除另一个前导 &

url = url.replace(/(\?)\&+/igm, "");

我们这里干净整洁URL

完整版:

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

如果你能找到一个班轮,不客气

编辑:结果 URL 应该是这个:https://www.somewebsite.fr/produit/yi-camera-3600-noir-vr-33705370/offre-81085802?awc=6901_1530705916_88ef12642ad61dfc5239ba01bbbe5249

我认为它可以像这样简单: url = url.replace(/(?<=&|\?)utm_.*?(&|$)/igm, "");

不需要转义&

(?<=&|\?) = 正面回顾

.*? = 一切,但 "not greedy"

您可以使用与所有 JS 版本兼容的单一正则表达式

  • 匹配并捕获 ? 后跟 1 个或多个 utm 参数后跟 utm 以外的参数并替换为 </code> 以恢复<code>? 因为有必要
  • 或者,将任何 ? 与查询字符串中的 1 个或多个 utm 参数匹配,其中除了 utm 之外不存在其他参数(因此,</code> 将是为空,<code>? 将被删除)
  • 或者,只匹配所有 utm 参数以删除它们。

正则表达式看起来像

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

regex demo

详情

  • (\?)utm[^&]*(?:&utm[^&]*)*&(?=(?!utm[^\s&=]*=)[^\s&=]+=) - ?utm? 在稍后用 </code> 引用的捕获组中),除 <code>& 之外的 0+ 个字符,然后&utm 的 0 次或多次重复后跟除 & 以外的 0+ 个字符,然后是 & 后跟 0+ 个除空格以外的字符,&= 然后 = 不是 utm param
  • | - 或
  • \?utm[^&]*(?:&utm[^&]*)*$ - ?utm& 以外的 0+ 个字符,然后 &utm 的 0 次或多次重复,后跟 [=27 以外的 0+ 个字符=] 然后是字符串的结尾
  • | - 或
  • &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, ''));
}