2014-09-24 35 views
1

我正在使用Struts2程序,該程序使用電子郵件模板文件構造電子郵件並使用通過表單字段檢索到的用戶輸入來替換模板中的某些佔位符字符串。 JavaMail project正用於形成電子郵件。Java代碼以保留任意輸入中的特殊字符

這裏是一個樣子:

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方法調用成功地取代電子郵件中的註釋內容。有任何想法嗎?

謝謝!

編輯:

我想這是有道理的,HTML不能有效地與正則表達式解析。也許我可以將電子郵件內容作爲明文,但我不確定這是我公司的願望。

+1

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – sanz 2014-09-24 18:31:26

+0

嘿,哇,那就是呃......我希望我已經知道這一點。謝謝!我想這有點讓人寬慰,但挑戰仍然在於嘗試使用基於獨特字符串的自定義內容形成電子郵件。 – 2014-09-24 18:35:57

+0

你會在上游游泳。你可以這樣做,但如果你不控制輸入,你會遇到錯誤。 – sanz 2014-09-24 18:48:20

回答

0

這不太好,但我最終做的是在parseline方法中使用StringBuilder來形成HTML,同時合併了用戶變量。

我稍後可能會將FreeMarker與它包含在Struts2內核中,但由於電子郵件信息非常簡單(並且很快就不會在樣式或內容中發生變化),所以現在就足夠了。

感謝您的建議。