正则表达式替换不是图像的链接中的域

时间:2010-03-17 06:02:17

标签: regex

需要替换页面上不是图像或pdf文件的所有链接上的域名。 这将是通过代理服务收到的完整html页面。

Example:
<a href="http://www.test.com/bla/bla">test</a><a href="/bla/bla"><img src="http://www.test.com" /><a href="http://www.test.com/test.pdf">pdf</a>
<a href="http://www.test.com/bla/bla/bla">test1</a>

Result:
<a href="http://www.newdomain.com/bla/bla">test</a><a href="/bla/bla"><img src="http://www.test.com" /><a href="http://www.test.com/test.pdf">pdf</a>
<a href="http://www.newdomain.com/bla/bla/bla">test1</a>

3 个答案:

答案 0 :(得分:2)

如果您使用的是.NET,我强烈建议您使用HTML Agility Pack 使用正则表达式进行直接解析可能非常容易出错。这个问题也与下面的帖子类似。

What regex should I use to remove links from HTML code in C#?

答案 1 :(得分:0)

如果域名为http://www.example.com,则应遵循以下规则:

/http:\/\/www\.example\.com\S*(?!pdf|jpg|png|gif)\s/

如果字符串在指定位置不包含pdf,png,jpg或gif,则使用负前瞻来确保正则表达式匹配字符串。

答案 2 :(得分:0)

如果您的pdf网址都没有查询参数(例如a.pdf?asd=12),则以下代码将起作用。它仅替换绝对和根相对URL。

var links = document.getElementsByTagName("a");
var len = links.length;
var newDomain = "http://mydomain.com";
/**
 * Match absolute urls (starting with http) 
 * and root relative urls (starting with a `/`)
 * Does not match relative urls like "subfolder/anotherpage.html"
 * */
var regex = new RegExp("^(?:https?://[^/]+)?(/.*)$", "i");
//uncomment next line if you want to replace only absolute urls
//regex = new RegExp("^https?://[^/]+(/.*)$", "i");
for(var i = 0; i < len; i++)
{
  var link = links.item(i);
  var href = link.getAttribute("href");
  if(!href) //in case of named anchors
    continue;
  if(href.match(/\.pdf$/i)) //if pdf
    continue;
  href = href.replace(regex, newDomain + "$1");
  link.setAttribute("href", href);
}