繁体   English   中英

如何使用JavaScript和Regex提取网址的一部分

[英]How to extract a part of the url using JavaScript and Regex

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

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];
});

这样我就可以用空字符串一次替换所有匹配的部分。
但是它不起作用。

我知道我需要有选择地删除网址的那些部分,而无需对它们的出现顺序做任何假设,但是我应该怎么做。

谢谢

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

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

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

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

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

第二部分获取我们不关心的参数并将其报废。 由于它们可能在开头(因此没有&),因此我们仅选择查找。 然后,我们要替换的项目以|分隔。 然后我们获取它的值,该值可以是字符串的下一个&或结尾为止的任何值)。

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

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

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

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

我会选择@samanime,但要稍做更改。

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

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

编辑
不知道网址行中的参数,但仅作为解析说明..
删除var可以如下进行。
我可以在这儿走,但如果? 用作域/参数列表
分隔符,以保持连续性,可能需要满足几个附加条件。
每次仍需要用捕获组1替换。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM