我正在使用正则表达式函数进行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&"">Faux Leather Deluxe Heated Seat Cushion</a>
</div>
我已经尝试了很多东西,但即使在将代码超级简化为您在此处看到的内容之后,似乎无法弄明白。
感谢您的帮助!
答案 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&';
}
);
}