2010-06-23 61 views
1

的情況下轉換錨標記相對URL絕對URL的HTML內容:使用Java

在服務器A上,我們要顯示從服務器B符合服務器A上

問題內容:

在一些服務器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

Java?所以你使用JSP/Servlet?你想在運行時(動態)還是在開發時(在所有文件中靜態查找和替換)執行此操作? – BalusC 2010-06-23 17:13:37

+0

運行時,JSP頁面對使用API​​調用(類似於代理服務器)從服務器b提取內容的本地servlet進行ajax調用。我們最初認爲最好/最簡單的方法是讓servlet以「工作順序」返回html片段,但是在閱讀Vivin的響應之後,最好讓視圖解釋來自Servlet的響應 – 2010-06-23 17:23:37

回答

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中,勞裏的回答將工作。

+0

謝謝,儘管這是一個Javascript解決方案對我來說效果很好。 – 2010-06-23 20:03:38

+0

Downvote並沒有解釋。 – 2013-06-06 02:13:43

3

根據圍繞您的Web應用程序設置方式的許多事情,以及您的高效定義,這可能不是您需要或正在尋找的內容。但無論如何,如果你有你的HTML作爲一個字符串(在例如過濾器的一些晚期),你可以做這樣的事情:

html = html.replaceAll("href=\"/", "href=\"http://server-b.com/") 
2

有我的方法,whitch我使用的轉換相對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(); 
} 

希望它有幫助。