Преобразование тега привязки с относительным URL в абсолютный URL в содержимом HTML с использованием Java - PullRequest
1 голос
/ 23 июня 2010

Ситуация:

На сервере 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

Ответы [ 3 ]

3 голосов
/ 23 июня 2010

В зависимости от того, как настроено ваше веб-приложение, а также от вашего определения эффективности, это может быть не то, что вам нужно или что вы ищете.Но в любом случае, если у вас есть HTML в виде строки (например, в какой-то поздней стадии фильтра), вы можете сделать что-то вроде этого:

2 голосов
/ 09 марта 2011

Есть мой метод, который я использую для преобразования относительных 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();
}

надеюсь, это поможет.

1 голос
/ 23 июня 2010

Я бы не стал делать это на Java;Мне нравится обрабатывать специфическую логику в слое вида.Я предполагаю, что этот блок кода поступает от вызова AJAX.Поэтому вы можете получить HTML-код из вызова AJAX и затем сделать следующее:

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, ответ Лаури сработает.

...