如何使用JavaScript和正则表达式提取url的一部分
我想从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
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?:\/\/[^\/]+|和?