Javascript替换为Regex在末尾添加引号

时间:2014-02-14 01:00:23

标签: javascript regex replace

我正在使用正则表达式函数进行javascript替换,当我返回代码时,在返回URL的末尾总会有一个额外的双引号。如果我发出警报(),则报价不显示,只有当我在函数中返回链接时。

<div class="postbody">
<a href="http://www.mystore.com/product/upc0009384775" class="postlink">Faux Leather Deluxe Heated Seat Cushion</a>
</div>
<script>
 var elements = document.getElementsByClassName('postbody');
for (var i=0;i<elements.length;i++)
{
    elements[i].innerHTML = elements[i].innerHTML.replace(/\"((?:http:\/\/|http:\/\/www.)mystore.)([a-zA-Z.]{2,5}\/)(product\/)([A-Za-z0-9]*)/gi,
        function(match,match2,match3,match4,match5)
        {
            return match2+'co.uk'+'/'+match4+match5+'/?referral=us-store&';
        }
    );
}
</script>

生成的HTML是:

<div class="postbody">
<a class="postlink" href="http://www.mystore.co.uk/product/upc0009384775/?referral=us-store&amp;&quot;">Faux Leather Deluxe Heated Seat Cushion</a>
</div>

我已经尝试了很多东西,但即使在将代码超级简化为您在此处看到的内容之后,似乎无法弄明白。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

更新,更好的描述:“包含”的原因是由于DOM的工作方式。您没有使用第一个匹配,因此报价将从返回的字符串中排除,但是你仍在替换引用.DOM将自动更正HTML,并在返回的URL周围添加引号(只有一个引号)。

以下示例应按步骤显示其工作原理:http://jsfiddle.net/danschultzer/HAG9j/3/

要解决您在使用查询参数处理URL时遇到的第二个问题,只需将正则表达式更改为更开放(在上面的示例中添加):

/\"((?:http:\/\/|http:\/\/www.)mystore.)([a-zA-Z.]{2,5}\/)(product\/)(.*)\"/gi

请注意,您需要在replace方法中解析查询值。您应该可以将/?替换为“?&amp;”。


这是因为你的正则表达式与结尾引用不匹配。您可以通过匹配第一个引号正确启动,但第二个引号不匹配。

将正则表达式更改为

/\"((?:http:\/\/|http:\/\/www.)mystore.)([a-zA-Z.]{2,5}\/)(product\/)([A-Za-z0-9]*)\"/gi

JSFiddle:http://jsfiddle.net/danschultzer/HAG9j/

但我建议您使正则表达式更加具体,并以href =为目标。当然这取决于你想要实现的目标。

答案 1 :(得分:0)

仍然不确定究竟发生了什么。看来由于某种原因,使用替换功能,浏览器会追加“返回值。

在盯着它之后,我意识到我的正则表达式正在寻找一个开头的双引号,但我没有回复开头的双引号。一旦我在回复中添加了开头双引号,浏览器(或我不确定的Javascript)就不再“附加”到返回的字符串。

<div class="postbody">
<a href="http://www.mystore.com/product/upc0009384775" class="postlink">Faux Leather Deluxe Heated Seat Cushion</a>
</div>
<script>
var elements = document.getElementsByClassName('postbody');
for (var i=0;i<elements.length;i++)
{
    elements[i].innerHTML = elements[i].innerHTML.replace(/\"((?:http:\/\/|http:\/\/www.)mystore.)([a-zA-Z.]{2,5}\/)(product\/)([A-Za-z0-9]*)/gi,
    function(match,match2,match3,match4,match5)
    {
        return '"'+match2+'co.uk'+'/'+match4+match5+'/?referral=us-store&';
    }
);

}