REGEX / replace仅适用一次

时间:2011-04-01 21:25:33

标签: javascript regex

我正在使用REGEX和js替换来动态填充href中的变量。下面的代码第一次在页面上使用时会起作用,但如果将另一个变量传递给函数,则它不会替换ANYTHING。

function change(fone){
    $("a[href^='/application']").each(function(){ 
        this.href = this.href.replace(/device=.*/,"device="+ fone);
    });
}

5 个答案:

答案 0 :(得分:3)

问题是this.href实际上返回了一个完整的绝对URL。因此,即使您的HTML为<a href="/foo">.href属性也会返回http://mydomain.com/foo

因此,您的href属性将填充完整的绝对URL,然后a[href^='/application']选择器不再匹配,因为href属性以域名开头,而不是/application。< / p>

答案 1 :(得分:1)

.href会返回完全限定的网址,例如`HTTP://www.mydomain.com/application / ......“。因此,选择器第二次不起作用,因为您的域相对URL已被完整的URL替换,并且它正在寻找以“/ application”开始的内容。

改为使用$(this).attr('href').replace...

在这里小提琴:http://jsfiddle.net/pcm5K/3/

答案 2 :(得分:1)

正如Squeegy所说,你是第一次更改href所以它不再以/application开头 - 第二次以http://开头。

您可以使用jQuery Attribute Contains Selector获取链接,使用捕获组进行替换可能也是更好的做法。像这样:

$("a[href*='/application']").each(function(){
     this.href = this.href.replace(/(device=)\w*/, "$1" + fone);
});

答案 3 :(得分:0)

您需要将g标记添加到match all instances of the pattern,因此您的正则表达式将如下所示:

/device=.*/g

,您的代码将如下所示:

this.href = this.href.replace(/device=.*/g,"device="+ fone);

答案 4 :(得分:0)

原因是除非所有链接都以“/ device =”开头。正则表达式不会工作。

you need to use /.*device=.*/ 

缺乏全球旗帜不是问题。它是你模式中的反斜杠。