问题:
我有一个生成报告的servlet,更具体地说是报告的表体。这是一个黑盒子,我们无法访问源代码。
尽管如此,它的工作令人满意,并且servlet不打算在短期内重写或更换。
我们需要修改其响应文本,以便将其生成的一些链接更新到其他报告中,我正在考虑使用过滤器来查找锚文本并使用正则表达式替换它。
研究
我遇到了this question,它有一个正则表达式过滤器。它应该是我需要的,但也许不是。
我并不是试图严格意义上解析parsing一词,而是我没有使用该语言的完整规范。我所拥有的是组成表体的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编写的正则表达式过滤器还是有更好的解决方案?
答案 0 :(得分: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);
}
}
答案 1 :(得分:0)
我使用了Jeremy Stein (click to go to question)个类,但有一些更改:
a)确保没有人关注过滤器链或servlet不要在包装器对象上调用getOutputStream(),否则会抛出invalidStateException(检查主题上的this answer by BalusC)。
b)我想在页面上进行一次更改,所以我没有在web.xml上放置任何filterConfig。
b.2)我也没有在web.xml上放任何东西。在类本身上使用javax.servlet.annotation.WebFilter
。
c)我设置了Pattern并直接在类上替换字符串:
Pattern searchPattern = Pattern.compile("<a (.*?) href=\".*?id=(.*?)[&|&]filtros=(.*?)\" (.*?)>(.*?)</a>");
String replaceString = "<a $1 href=\"/webReports/report.xhtml?idRel=$2&filtros=$3\" target=\"_parent\" $4>$5</a>";
请注意.*?
尽可能少地匹配,以避免匹配超过想要的匹配。
为了测试匹配和正则表达式,我在研究主题时使用了this applet I found。
希望这可以帮助任何有同样问题的人。