【问题标题】:How to extract a part of the url using JavaScript and Regex如何使用 JavaScript 和 Regex 提取部分 url
【发布时间】:2014-02-21 17:21:17
【问题描述】:

我想从 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 及其值和域名部分,即http://www.example.com

可以看出,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 的这些部分,而不对它们的出现顺序做任何假设,但我应该如何去做。

谢谢

【问题讨论】:

  • 您是要在 URL 中保留 &ref 和 &mycracker 的值,还是同时删除它们
  • 我想删除 &mycracker 和 &ref 的值及其值部分。对不起,我已经编辑了我的问题。
  • 太棒了。 &ref 和 &mycracker 是否会始终位于 URL 的末尾并且彼此相邻,或者这些可能会改变吗?
  • 不,位置不是固定的,URL 的一部分,即(&offer 及其值)可能会出现在它们之后。我需要它进行进一步处理。

标签: javascript regex url


【解决方案1】:

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

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

【讨论】:

  • 你说的是哪个,这个"/^(http:\/\/)?.*?\//"
  • 是的,应该是^(http:\/\/)?.*?\/'
【解决方案2】:

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

inputStr.replace(/^https?:\/\/[^\/]+\/|&?(mycracker|ref)=[^&]*/g, '')

这是一个 JSFiddle:http://jsfiddle.net/4L6BH/1/

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

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

第二部分获取我们不关心的参数并将它们废弃。由于它们可能位于开头(因此没有 &),我们只能选择性地查找它。然后我们有了要替换的项目,用 | 分隔。然后我们舀取它的值,直到下一个 & 或字符串结尾为止的任何值。

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

我们只是抓取这些位,用空字符串替换它们,然后中提琴。

【讨论】:

  • 好的,您想详细说明一下正则表达式吗?我也在寻找这样的东西。
  • 我想我想保留域名的最后一个/。我可以使用类似 inputStr.replace(/^https?:\/\/[^\/]+|&?(mycracker|ref)=[^&]*/g, '')
  • 添加了一些解释。
  • 对于您的评论,是的,如果您想保留该斜线,只需像您展示的那样删除该 \/。
【解决方案3】:

我会选择@samanime,但要稍作改动。

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

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

编辑
不知道 url 行中的参数,但只是作为解析说明..
可以像下面这样去除变量。
我可能会离开这里,但如果?用作域/参数列表
分隔符,为了保持连续性,可能需要一些额外的条件。
仍然需要每次都替换为捕获组 1。

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

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

【讨论】:

  • 小改动有什么作用?
  • 不知道url参数形式。但是,如果 ? 分隔(表示)变量的开头,则此更改将匹配它以代替似乎是变量分隔符的 &。它停止匹配 &this mycracker= 。基本上它会留在 ?如果在这个位置。所以,它正确地处理了这个,'/p?mycracker=A&mycracker=B&thismycracker=C'
猜你喜欢
  • 2020-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多