【问题标题】:Converting anchor tag with relative URL to absolute URL in HTML content using Java使用 Java 将具有相对 URL 的锚标记转换为 HTML 内容中的绝对 URL
【发布时间】:2011-03-07 10:33:48
【问题描述】:

情况:

在服务器 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

【问题讨论】:

  • Java?那么您使用的是 JSP/Servlet 吗?您想在运行时(动态)还是仅在开发期间(在所有文件中静态查找和替换)执行此操作?
  • 运行时,JSP 页面对本地 servlet 进行 ajax 调用,该 servlet 使用 API 调用(有点像代理)从 server-b 中提取内容。我们最初认为让 servlet 以“工作顺序”返回 html sn-p 是最好/最简单的,但是在阅读 Vivin 的响应之后,最好让视图解释来自 servlet 的响应

标签: java regex html-parsing


【解决方案1】:

取决于您的网络应用程序的设置方式以及您对高效的定义,这可能不是您需要或正在寻找的。但无论如何,如果您将 HTML 作为字符串(例如在过滤器的某个后期阶段),您可以执行以下操作:

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

【讨论】:

    【解决方案2】:

    有我的方法,用于将相对 URL 转换为绝对 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();
    }
    

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      我不会在 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 的答案会起作用。

      【讨论】:

      • 谢谢,虽然这是一个 Javascript 解决方案,但对我来说效果很好。
      猜你喜欢
      • 2015-09-29
      • 1970-01-01
      • 2014-12-12
      • 2011-10-24
      • 2021-07-28
      • 1970-01-01
      • 2019-05-10
      • 1970-01-01
      相关资源
      最近更新 更多