【问题标题】:Removing utm_* parameters from URL in javascript with a regex使用正则表达式从 javascript 中的 URL 中删除 utm_* 参数
【发布时间】:2018-12-13 17:04:59
【问题描述】:

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

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

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

有这样的网址 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

这个网址已经有效,但我们有一些欺骗和迹象 如果您从第一个请求中删除 $1,您将只使用 & 符号而不是 ?你一开始就应该拥有的

所以接下来清理我们保留第一个?符号 => $1 并删除其他前导 &

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

这里我们有一个漂亮干净的网址

完整版:

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 是什么?
  • 好点我已经编辑了我的问题
  • 如果查询字符串仅包含 utm 参数,@benraay /(?<=&|\?)utm_.*?(&|$)/igm 不会删除结尾的 ?。它也不能跨不支持 ECMAScript 2018 标准的 JS 环境移植。

标签: javascript node.js regex url clean-urls


【解决方案1】:

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

你不需要转义&

(?<=&|\?) = 正面观察

.*? = 一切,但“不贪心”

【讨论】:

  • 非常好,参数值也更强!谢谢
  • 请注意,它包含一个仅受 ECMAScript 2018 兼容的 JS 环境支持的后向功能。此外,如果查询字符串仅包含 utm 参数,它不会删除结尾的 ?。见this demohttps://www.somewebsite.fr/produit/yi-camera-3600-noir-vr-33705370/offre-81085802?utm=6901_1530705916_88ef12642ad61dfc5239ba01bbbe5249&utm=ewehttps://www.somewebsite.fr/produit/yi-camera-3600-noir-vr-33705370/offre-81085802? 结尾。
  • 正是我不知道我需要的是 node js 8 并且它适用于该版本
  • @benraay 好吧,我想我当时误解了目标。你说https://www.some.fr/812?&&aws=true 已经可以了,我认为你想要尽可能干净的模式。
【解决方案2】:

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

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

正则表达式看起来像

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

regex demo

详情

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

【讨论】:

  • 非常好的和详细的解决方案,但可读性有点丢失,我更喜欢我的前两个班轮版本,它更容易理解
  • @benraay 可读性丢失了,没错,但是它包含了所有可能的场景,并展示了如何动态构建模式。该解决方案可以定制以轻松删除其他参数,并且可以与不支持后视的正则表达式库一起使用,例如不支持 ECMAScript 2018 标准的 VBA 或 JS 版本。
猜你喜欢
  • 2020-07-12
  • 1970-01-01
  • 2016-07-23
  • 2016-10-15
  • 2017-02-27
  • 1970-01-01
  • 2014-05-21
  • 2019-02-16
相关资源
最近更新 更多