我正在使用Struts2程序,该程序使用电子邮件模板文件构造电子邮件,并使用通过表单字段检索的用户输入替换模板中的某些占位符字符串。 JavaMail project正用于构成电子邮件。
以下是这样的:
InputStream in = getClass().getResourceAsStream("emailTemplate.html");
Scanner scanner = new Scanner( in );
String content = "";
while( scanner.hasNextLine() ) {
content += parseLine( scanner.nextLine() );
}
// ...
email.setHtmlContent( content );
parseLine
方法如下所示:
String emailReqNum = //internal code to return number from form;
String emailCompDate = //internal code to return date from form;
String emailComment = //internal code to return comment from form;
String emailStatus = //internal code to return status from form;
String emailServer = //internal code to return server from form;
line = line.replaceAll( "\\[REQUEST NUMBER\\]", emailReqNum );
line = line.replaceAll( "\\[ESTIMATED COMPLETION DATE\\]", emailCompDate );
line = line.replaceAll( "\\[COMMENT\\]", emailComment );
line = line.replaceAll( "\\[STATUS\\]", emailStatus );
line = line.replaceAll( "\\[SERVER\\]", emailServer );
这就是电子邮件模板的一部分:
<table>
<tr><td><b>Request Number:</b></td><td>[REQUEST NUMBER]</td></tr>
<tr><td><b>Est. Completion Date:</b></td><td>[ESTIMATED COMPLETION DATE]</td></tr>
<tr><td><b>Comment:</b></td><td>[COMMENT]</td></tr>
<tr><td><b>Status:</b></td><td>[STATUS]</td></tr>
</table>
问题在于,只要用户在注释字段中输入特殊的RegEx字符(\ ^ $ . | ? * + ( ) [ ] { }
),就会破坏replaceAll
方法:
Exception in thread "main" java.lang.IllegalArgumentException: Illegal group reference
at java.util.regex.Matcher.appendReplacement(Matcher.java:725)
at java.util.regex.Matcher.replaceAll(Matcher.java:825)
at java.lang.String.replaceAll(String.java:1572)
我尝试用逃脱的版本替换每个违规的特殊字符,但这似乎不起作用,并且看起来很丑陋:
String filtered = emailComment;
filtered.replaceAll("\\","\\\\");
filtered.replaceAll("\\^","\\\\^");
filtered.replaceAll("\\$","\\\\$");
filtered.replaceAll("\\.","\\\\.");
filtered.replaceAll("\\|","\\\\|");
filtered.replaceAll("\\?","\\\\?");
filtered.replaceAll("\\*","\\\\*");
filtered.replaceAll("\\+","\\\\+");
filtered.replaceAll("\\(","\\\\(");
filtered.replaceAll("\\)","\\\\)");
filtered.replaceAll("\\[","\\\\[");
filtered.replaceAll("\\]","\\\\]");
filtered.replaceAll("\\{","\\\\{");
filtered.replaceAll("\\}","\\\\}");
我也愚弄了一些循环。
我最终要做的是查看用户输入的注释,找到任何特殊字符,并可能更改它们,以便在parseLine(上面)中的replaceAll方法调用成功地替换注释电子邮件的内容。有什么想法吗?
谢谢!
修改
我认为使用RegEx无法有效解析HTML是有意义的。也许我可以把电子邮件内容写成明文,但我不确定这是我公司想要的。
答案 0 :(得分:0)
它并不漂亮,但我最终做的是在StringBuilder
方法中使用parseline
来构建HTML,同时合并用户变量。
我可能会在以后加入FreeMarker,因为它已经包含在Struts2核心中了,但由于电子邮件消息非常简单(并且很快就不会在样式或内容上发生变化),现在就足够了。
感谢您的建议。