1

问题:

我有一个生成报告的 servlet,更具体地说是报告的表体。它是一个黑匣子,我们无权访问源代码。

尽管如此,它的工作还是令人满意的,并且不打算在短期内重写或替换 servlet。

我们需要修改它的响应文本以更新它生成的一些链接到其他报告,我正在考虑使用一个过滤器来查找锚文本并使用正则表达式替换它。

研究:

我遇到了这个有正则表达式过滤器的问题。这应该是我需要的,但也许不是。

我并没有尝试在解析术语的严格意义上解析 HTML,并且我没有使用该语言的完整规范。我拥有的是组成表格主体的 HTML 标记子集,并且没有嵌套表格,因此 servlet 生成的 HTML 子集不是递归的。

我只需要找到/替换锚目标并向标签添加一个属性。

所以问题是:

我需要修改 servlet 的输出以更改所有此类链接:

<a href="http://mypage.com/servlets/reports/?a=report&id=MyReport&filters=abcdefg">

进入如下链接:

<a href="http://myOtherPage.com/webReports/report.xhtml?id=MyReport&filters=abcdefg" target="_parent">

我应该使用@ Jeremy Stein编写的正则表达式过滤器还是有更好的解决方案?

4

2 回答 2

1

假设目标 A 标记中唯一不同的部分是 href 属性的查询组件,那么这个经过测试的正则表达式解决方案应该做得很好:

// TEST.java 20121024_0800
import java.util.regex.*;
public class TEST {
    public static String fixReportAnchorElements(String text) {
        Pattern re_report_anchor = Pattern.compile(
            "<a href=\"http://mypage\\.com/servlets/reports/\\?a=report&id=([^\"]+)\">",
            Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
        Matcher m = re_report_anchor.matcher(text);
        return m.replaceAll(
            "<a href=\"http://myOtherPage.com/webReports/report.xhtml?id=$1\" target=\"_parent\">"
            );
    }
    public static void main(String[] args) {
        String input =
            "test <a href=\"http://mypage.com/servlets/reports/?a=report&id=MyReport&filters=abcdefg\"> test";
        String output = fixReportAnchorElements(input);
        System.out.println(output);
    }
}
于 2012-10-24T14:57:47.530 回答
0

我使用了 Jeremy Stein(点击进入问题)课程,并进行了一些更改:

a) 确保过滤器链或 servlet 中的任何人都不会在包装器对象上调用 getOutputStream(),否则它会抛出 invalidStateException(检查BalusC对主题的回答)。

b) 我想在页面上进行一次更改,所以我没有在 web.xml 上放置任何 filterConfig。

b.2) 我也没有在 web.xml 上放任何东西。使用javax.servlet.annotation.WebFilter了类本身。

c)我直接在类上设置模式和替换字符串:

Pattern searchPattern = Pattern.compile("<a (.*?) href=\".*?id=(.*?)[&amp;|&]filtros=(.*?)\" (.*?)>(.*?)</a>");
String replaceString = "<a $1 href=\"/webReports/report.xhtml?idRel=$2&filtros=$3\" target=\"_parent\" $4>$5</a>";

注意.*?要尽可能少地匹配,以避免匹配超过想要的。

为了测试匹配和正则表达式,我使用了我在研究该主题时发现的这个小程序。

希望这可以帮助任何有同样问题的人。

于 2012-10-24T16:58:53.633 回答