我试图仅在遇到的<pre>
标签内转义HTML(不要问我这样做是否有逻辑)
我确实写了这个简短的程序,它可以正常工作,但是我想跳到下一场比赛,而没有实际添加id="ProcessedTag"
,所以它不仅仅代替第一场比赛。这是我的代码:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import static org.apache.commons.lang3.StringEscapeUtils.escapeHtml4;
public class ReplaceHTML {
public static void main(String[] args) {
String html = "something something < > && \"\" <pre> text\n" +
"< >\n" +
"more text\n" +
"&\n" +
"<\n" +
"</pre>\n" +
"and some more text\n" +
"<pre> text < </pre>";
Pattern pattern = Pattern.compile("(?i)(?s)<pre>(.*?)</pre>");
Matcher matcher = pattern.matcher(html);
while(matcher.find()) {
html = html.replaceFirst("(?i)(?s)<pre>(.*?)</pre>", "<pre id=\"ProcessedTag\">" + escapeHtml4(matcher.group(1)) + "</pre>");
}
System.out.println(html);
}
}
因此,为了不只替换第一个匹配项,我决定添加此id="ProcessedTag"
,以便replaceFirst可以移至下一个匹配项。我猜应该有一种更聪明的方法来做到这一点,而无需添加任何其他内容。
请问这是一个愚蠢的问题,还是以前有人问过(找不到有用的东西)
致谢。
答案 0 :(得分:1)
您应该在此处使用Matcher#appendReplacement
Pattern pattern = Pattern.compile("(?i)(?s)<pre>(.*?)</pre>");
Matcher matcher = pattern.matcher(html);
StringBuffer buffer = new StringBuffer("");
while (matcher.find()) {
matcher.appendReplacement(buffer, "<pre>" + escapeHtml4(matcher.group(1)) + "</pre>");
}
matcher.appendTail(buffer);
System.out.println(buffer);
请注意,通常不希望对HTML内容使用正则表达式。但是,在这种情况下,您要替换的标签没有嵌套,正则表达式可能是可行的。