【问题标题】:How to parse a url using Javascript and Regular Expression?如何使用 Javascript 和正则表达式解析 url?
【发布时间】:2025-11-25 09:25:02
【问题描述】:

我想解析一些具有以下格式的网址:-

var url ="http://www.example.com/cooks/cooking-dress-wine/~no-order/pr?p%5B%5D=sort%3Dfeatured&sid=bks%2C43p&mycracker=ch_vn_clothing_subcategory_Puma&ref=b41c8097-8efe-4acf-8919-0fa81bcb590a" 

所有网址的域名和其他部分不必相同,它们可以有所不同,即我正在寻找一个通用的解决方案。

基本上我想去掉所有其他的东西,只得到一部分:

/cooks/cooking-dress-wine/~no-order/pr?p%5B%5D=sort%3Dfeatured&sid=bks%2C43p

我想用 JavaScript 和正则表达式来解析这个

我是这样做的:

var mapObj = {"/^(http:\/\/)?.*?\//":"","(&mycracker.+)":"","(&ref.+)":""};
var re = new RegExp(Object.keys(mapObj).join("|"),"gi");
url = url.replace(re, function(matched){
  return mapObj[matched];
}); 

但它返回这个

http://www.example.com/cooks/cooking-dress-wine/~no-order/pr?p%5B%5D=sort%3Dfeatured&sid=bks%2C43pundefined

我在哪里做的不对?还是有其他更简单的解决方案?

【问题讨论】:

    标签: javascript regex url


    【解决方案1】:
    var url ="http://www.example.com/cooks/cooking-dress-wine/~no-order/pr?p%5B%5D=sort%3Dfeatured&sid=bks%2C43p&mycracker=ch_vn_clothing_subcategory_Puma&ref=b41c8097-8efe-4acf-8919-0fa81bcb590a";
    var newAddr = url.substr(22,url.length);
    // newAddr == "/cooks/cooking-dress-wine/~no-order/pr?p%5B%5D=sort%3Dfeatured&sid=bks%2C43p&mycracker=ch_vn_clothing_subcategory_Puma&ref=b41c8097-8efe-4acf-8919-0fa81bcb590a"
    

    22 是开始分割字符串的位置。

    url.length 是要包含多少。

    只要链接上的域名保持不变,此方法就有效。

    【讨论】:

    • 但我仍然想摆脱 &mycracker=ch_vn_clothing_subcategory_Puma&ref=b41c8097-8efe-4acf-8919-0fa81bcb590a 而我上面的 url 只是一个指示性 url,我想在所有场景中使用相同的脚本.
    【解决方案2】:

    为什么不只映射一个拆分数组?

    您不需要对 URL 进行正则表达式,但您必须在循环内运行 if 语句以从中删除特定的 GET 参数。在这种特殊情况下(关键字特别)你只需要子串直到indexOf "&mycracker"

    var url ="http://www.example.com/cooks/cooking-dress-wine/~no-order/pr?p%5B%5D=sort%3Dfeatured&sid=bks%2C43p&mycracker=ch_vn_clothing_subcategory_Puma&ref=b41c8097-8efe-4acf-8919-0fa81bcb590a" 
    var x = url.split("/");
    var y = [];
    x.map(function(data,index) { if (index >= 3) y.push(data); });
    var path = "/"+y.join("/");
    path = path.substring(0,path.indexOf("&mycracker"));
    

    【讨论】:

    • 但我仍然想摆脱 &mycracker=ch_vn_clothing_subcategory_Puma&ref=b41c8097-8efe-4acf-8919-0fa81bcb5‌​90a 而我上面的 url 只是一个指示性 url,我想使用相同的脚本所有场景
    • 已更新以截断 "&mycracker" 索引处的 URL,并且该 URL 与您想要的 URL 匹配。
    【解决方案3】:

    你可以使用:

    /(?:https?:\/\/[^\/]*)(\/.*?)(?=\&mycracker)/
    

    代码:

    var s="http://www.example.com/cooks/cooking-dress-wine/~no-order/pr?p%5B%5D=sort%3Dfeatured&sid=bks%2C43p&mycracker=ch_vn_clothing_subcategory_Puma&ref=b41c8097-8efe-4acf-8919-0fa81bcb590a";
    var ss=/(?:https?:\/\/[^\/]*)(\/.*?)(?=\&mycracker)/;
    console.log(s.match(ss)[1]);
    

    Demo

    Fiddle Demo

    说明:

    【讨论】:

    • 如果没有cook这个词怎么办?我的意思是我构建这个 url 只是为了让我们了解我面临的问题。
    • 是的,这看起来不错。
    • 是的,杰森,我也喜欢它。
    【解决方案4】:

    下面的代码稍微改一下,就可以取回任意参数了:

    var url = "http://www.example.com/cooks/cooking-dress-wine/~no-order/pr?p%5B%5D=sort%3Dfeatured&sid=bks%2C43p&mycracker=ch_vn_clothing_subcategory_Puma&ref=b41c8097-8efe-4acf-8919-0fa81bcb590a"
    var re = new RegExp(/http:\/\/[^?]+/);
    var part1 = url.match(re);
    var remain = url.replace(re, '');
    //alert('Part1: ' + part1);
    var rf = remain.split('&');
    // alert('Part2: ' + rf);
    var part2 = '';
    for (var i = 0; i < rf.length; i++) 
        if (rf[i].match(/(p%5B%5D|sid)=/))
            part2 += rf[i] + '&';
    part2 = part2.replace(/&$/, '');
    //alert(part2)
    url = part1 + part2;
    alert(url);
    

    【讨论】:

      最近更新 更多