如何使用JavaScript和正则表达式提取url的一部分

如何使用JavaScript和正则表达式提取url的一部分,javascript,regex,url,Javascript,Regex,Url,我想从url中提取一些具有以下格式的数据: http://www.example.com/biglasses/pr?p[]=ets.ideal_for%255B%255D%3Ds&p[]=ets.ideal_for%255B%255D%3Dn&p[]=sort%3Dpopularity&sid=23426x&offer=bigglassesMin30_RipoP.&ref=8be2b7f4-521c-4c45-9021-33d1df588eb9&m

我想从url中提取一些具有以下格式的数据:

http://www.example.com/biglasses/pr?p[]=ets.ideal_for%255B%255D%3Ds&p[]=ets.ideal_for%255B%255D%3Dn&p[]=sort%3Dpopularity&sid=23426x&offer=bigglassesMin30_RipoP.&ref=8be2b7f4-521c-4c45-9021-33d1df588eb9&mycracker=ch_vn_men_sungla_promowidget_banner_0_image

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

http://www.example.com/biglasses/pr?p[]=ets.ideal_for%255B%255D%3Ds&p[]=ets.ideal_for%255B%255D%3Dn&p[]=sort%3Dpopularity&sid=23426x&ref=8be2b7f4-521c-4c45-9021-33d1df588eb9&mycracker=ch_vn_men_sungla_promowidget_banner_0_image&offer=bigglassesMin30_RipoP.
基本上我想去掉&myCracker及其值&ref及其值和域名部分,即

可以看出,url数据的有用部分散布在这些字符之间,即&myCracker及其值和&ref及其值

我试着这样做:

var mapObj = {"/^(http:\/\/)?.*?\//":"","(&mycracker.+)":"","(&ref.+)":""};
var re = new RegExp(Object.keys(mapObj).join("|"),"gi");
url = url.replace(re, function(matched){
    return mapObj[matched];
});
这样我就可以用一个空字符串一次替换所有匹配的部分。
但它不起作用

我知道我需要有选择地删除url的这些部分,而不必对它们的出现顺序做出任何假设,但我应该如何去做呢


谢谢

JavaScript string.replace函数发送在
matched
参数中匹配的文本。代码似乎期望它返回在mapObj中用作键的正则表达式文本。也许它应该是
url.replace(re',)


第一个正则表达式不应以“/”开头或结尾

JavaScript string.replace函数发送
matched
参数中匹配的文本。代码似乎期望它返回在mapObj中用作键的正则表达式文本。也许它应该是
url.replace(re',)


第一个正则表达式不应以“/”开头或结尾

最简单的方法是用空字符串替换它们,只留下所需的位

inputStr.replace(/^https?:\/\/[^\/]+\/|&?(mycracker|ref)=[^&]*/g, '')
下面是一个JSFIDLE:

正则表达式非常简单。基本上有两个部分组合在一起:
^https?:\/\/[^\/]+\/
&?(mycracker | ref)=[^&]*

第一部分获取任何域(带有任何子域)。如果您只使用一个域,您可以将其澄清为仅使用该域(但这也会降低灵活性)。它还可以选择执行http和https协议(因此是
s?

第二部分得到了我们不关心的参数,并将其删除。因为它们可能在开头(因此没有&),所以我们只能选择查找它。然后,我们有了要替换的项,用|分隔。然后我们获取它的值,在下一个(或字符串末尾)之前,它是任何值

最后一个特殊点是,我们添加了g标志,以确保它替换所有实例(没有它,它只会做第一件事,那就是域)


我们只需要抓取这些位,用空字符串替换它们,还有中提琴。

最简单的方法就是用空字符串替换它们,只留下你想要的位

inputStr.replace(/^https?:\/\/[^\/]+\/|&?(mycracker|ref)=[^&]*/g, '')
下面是一个JSFIDLE:

正则表达式非常简单。基本上有两个部分组合在一起:
^https?:\/\/[^\/]+\/
&?(mycracker | ref)=[^&]*

第一部分获取任何域(带有任何子域)。如果您只使用一个域,您可以将其澄清为仅使用该域(但这也会降低灵活性)。它还可以选择执行http和https协议(因此是
s?

第二部分得到了我们不关心的参数,并将其删除。因为它们可能在开头(因此没有&),所以我们只能选择查找它。然后,我们有了要替换的项,用|分隔。然后我们获取它的值,在下一个(或字符串末尾)之前,它是任何值

最后一个特殊点是,我们添加了g标志,以确保它替换所有实例(没有它,它只会做第一件事,那就是域)


我们只需要抓取这些位,用一个空字符串替换它们,还有中提琴。

我会选择@samanime,但要做一点小小的改变

查找:
/^https?:\/\/[^\/]+|(?:(\?)|&)(?:mycracker | ref)=[^&]*/g
替换
'\1'

    ^ https?:// [^/]+      
 |       
    (?:     
         ( \? )               # (1)     
      |  &     
    )     
    (?: mycracker | ref )     
    = [^&]*      
编辑
不知道url行中的参数,只是作为解析说明。
可以按如下方式剥离VAR。
我可能离这里很远,但如果?用作域/参数列表
分隔符,为保持连续性,可能会应用两个附加条件。
每次仍需要替换为捕获组1

     #  /^https?:\/\/[^\/]+|(?:(\?)(?:mycracker|ref)=[^&]*&)|(?:\?(?:mycracker|ref)=[^&]*$)|(?:&(?:mycracker|ref)=[^&]*)/g

     # Domain
     ^ https?:// [^/]+ 
  |  
     # (?)var=&
     (?:
          ( \? )               # (1)
          (?: mycracker | ref )
          = [^&]*      
          &                    # &
     )
  |  
     # ?var=(EOS)
     (?:
          \?
          (?: mycracker | ref )
          = [^&]*      
          $                    # EOS
     )
  |  
     # &var=
     (?:
          &     
          (?: mycracker | ref )
          = [^&]*      
     )

我会选择@samanime,但做一点小小的改变

查找:
/^https?:\/\/[^\/]+|(?:(\?)|&)(?:mycracker | ref)=[^&]*/g
替换
'\1'

    ^ https?:// [^/]+      
 |       
    (?:     
         ( \? )               # (1)     
      |  &     
    )     
    (?: mycracker | ref )     
    = [^&]*      
编辑
不知道url行中的参数,只是作为解析说明。
可以按如下方式剥离VAR。
我可能离这里很远,但如果?用作域/参数列表
分隔符,为保持连续性,可能会应用两个附加条件。
每次仍需要替换为捕获组1

     #  /^https?:\/\/[^\/]+|(?:(\?)(?:mycracker|ref)=[^&]*&)|(?:\?(?:mycracker|ref)=[^&]*$)|(?:&(?:mycracker|ref)=[^&]*)/g

     # Domain
     ^ https?:// [^/]+ 
  |  
     # (?)var=&
     (?:
          ( \? )               # (1)
          (?: mycracker | ref )
          = [^&]*      
          &                    # &
     )
  |  
     # ?var=(EOS)
     (?:
          \?
          (?: mycracker | ref )
          = [^&]*      
          $                    # EOS
     )
  |  
     # &var=
     (?:
          &     
          (?: mycracker | ref )
          = [^&]*      
     )

您想在URL中保留&ref和&mycracker的值,还是同时删除它们?我想删除&mycracker和&ref的值及其值部分。抱歉不够清晰,我已经编辑了我的问题。太好了。&ref和&mycracker是否总是位于URL的末尾,并且彼此相邻?或者它们是否可能会发生变化?没有位置是不固定的,URL的一部分,即(&offer及其值)可能位于这两个位置之后。我需要它以便进一步处理。您是想在URL中保留&ref和&mycracker的值,还是同时删除它们?我想删除&mycracker和&ref的值及其值部分。抱歉不够清晰,我已经编辑了我的问题。太好了。&ref和&mycracker是否总是位于URL的末尾,并且彼此相邻?或者它们是否可能会发生变化?没有位置是不固定的,URL的一部分,即(&offer及其值)可能位于这两个位置之后。我需要它做进一步的处理。好的,你想详细说明一下正则表达式吗。我也在寻找类似的东西。我想我想保留域名中的最后一个。我可以使用类似inputStr.replace(/^https?:\/\/[^\/]+|和?