情况:
在服务器A上,我们希望在服务器A上显示来自服务器B的内容。
问题:
服务器B上内容中的某些超链接是相对于服务器B的,这使得它们在服务器A上显示时无效。
给定一个包含锚标签的HTML代码块,如下所示
<a href="/something/somwhere.html">Somewhere</a>
将它们转换为
的最有效方法是什么 <a href="http://server-b.com/something/somewhere.html">Somewhere</a>
内容中可能有多个锚标记,一个问题是有些可能是绝对的,我想保留原样,我只想将服务器B的域添加到相对URL
答案 0 :(得分:3)
根据您的网络应用程序设置方式的很多内容,以及您对效率的定义,这可能不是您需要或正在寻找的内容。但无论如何,如果您将HTML作为String(例如在Filter的某个后期阶段),您可以执行以下操作:
html = html.replaceAll("href=\"/", "href=\"http://server-b.com/")
答案 1 :(得分:2)
有我的方法,我用它将相对URL转换为绝对值。我用它将一些页面转换成电子邮件正文。
public String replaceLinks(String address, String content) throws URISyntaxException{
//absolute URI used for change all relative links
URI addressUri = new URI(address);
//finds all link atributes (href, src, etc.)
Pattern pattern = Pattern.compile("(href|src|action|background)=\"[^\"]*\"", Pattern.CASE_INSENSITIVE);
Matcher m = pattern.matcher(content);
//determines if the link is allready absolute
Pattern absoluteLinkPattern = Pattern.compile("[a-z]+://.+");
//buffer for result saving
StringBuffer buffer = new StringBuffer();
//position from where should next interation take content to append to buffer
int lastEnd = 0;
while(m.find()){
//position of link in quotes
int startPos = content.indexOf('"',m.start())+1;
int endPos = m.end()-1;
String link = content.substring(startPos,endPos);
Matcher absoluteMatcher = absoluteLinkPattern.matcher(link);
//is the link relative?
if(!absoluteMatcher.find())
{
//create relative URL
URI tmpUri = addressUri.resolve(link);
//append the string between links
buffer.append(content.substring(lastEnd,startPos-1));
//append new link
buffer.append(tmpUri.toString());
lastEnd =endPos+1;
}
}
//append the end of file
buffer.append(content.substring(lastEnd));
return buffer.toString();
}
希望它有所帮助。
答案 2 :(得分:1)
我不会在Java中这样做;我喜欢在视图层中处理特定于视图的逻辑。我假设这段代码来自AJAX调用。所以你可以做的是从AJAX调用中获取HTML,然后执行以下操作:
jQuery(html).find("a[href]").each(function(index, value) {
var $a = jQuery(value);
var href = $a.attr("href");
if(!/^http:/.test(href)) {
$a.attr("href", "http://server-b.com" + href);
}
});
或者,如果你真的想用Java做这个,那么Lauri的答案就可以了。