背景:
使用wangEditor时,需要在后端对富文本内容的<img />标签进行操作,而且不止
一个,需要将图 片的width和height修改为固定值(358*264)。
法一:XML转为JSON
包:
import cn.hutool.json.JSONObject;
import cn.hutool.json.XML;
import cn.hutool.json.JSONUtil;
效果:
<p><img src="https://www.aikeyunkang.top:8081/api/upload/actionPicture/1668066194737.png" style="max-width:100%;" contenteditable="false" width="50%"/><br/><img src="https://www.aikeyunkang.top:8081/api/upload/actionPicture/1668757490888.jpg" style="max-width:100%;" contenteditable="false"/></p><p _msthash="515125" _msttexthash="6268977">测试</p>
{"p":[{"img":[{"contenteditable":false,"src":"https://www.aikeyunkang.
top:8081/api/upload/actionPicture/1668066194737.png","width":"50%",
"style":"max-width:100%;"},{"contenteditable":false,"src":"https://
www.aikeyunkang.top:8081/api/upload/actionPicture/1668757490888.jpg",
"style":"max-width:100%;"}],"br":""},{"_msttexthash":6268977,"content":
、"测试","_msthash":515125}]}
核心代码:
JOSNObject jsonObject = XML.toJSONObject(xml);
String xml = JSONUtil.toXmlStr(jsonObject);
法二:使用正则表达式直接匹配
代码及步骤:
创建正则表达式 :Pattern pattern = Pattern.compile( "<\\s*img\\s+([^>]*)\\s*/>");
创建Matcher(匹配器,提供了对正则表达式的分组支持):Matcher matcher = pattern.matcher(content);
匹配成功:matcher.find()返回true
分组:matcher.group(1) 查找到img标签中的内容后进行replace就ok
public void xmlToJson() {
String content = "<p><img src=\"https://www.aikeyunkang.top:8084/api/upload/actionPicture/1668066194737.png\" style=\"max-width:100%;\" contenteditable=\"false\" width=\"33\" height=\"22\"/><br/><br/></p><p _msthash=\"515125\" _msttexthash=\"6268977\">测试</p>";
String content1 = "<p><img src=\"https://www.aikeyunkang.top:8081/api/upload/actionPicture/1669194735556.jpg\" style=\"max-width:100%;\" contenteditable=\"false\" width=\"50%\"/><br/><font _mstmutation=\"1\" _msthash=\"20488\" _msttexthash=\"23868\">6666</font><br/><img src=\"https://www.aikeyunkang.top:8081/api/upload/actionPicture/1669432587484.jpg\" style=\"max-width:100%;\" contenteditable=\"false\" width=\"50%\"/></p><p><!--_msttexthash--><!--_msthash--></p><style>max-width:100%;</style>";
String content2 = "<p><img src=\"https://www.aikeyunkang.top:8081/api/upload/actionPicture/1669194735556.jpg\" style=\"max-width:100%;\" contenteditable=\"false\"/><br/><br/><font _mstmutation=\"1\" _msthash=\"20488\" _msttexthash=\"23868\">6666</font><br/></p><p><font _mstmutation=\"1\" _msthash=\"20488\" _msttexthash=\"23868\"><img src=\"https://www.aikeyunkang.top:8081/api/upload/actionPicture/1669434182271.jpg\" style=\"max-width:100%;\" contenteditable=\"false\"/></font></p><p><!--_msttexthash--><!--_msthash--></p><style>max-width:100%;</style>";
//获取img标签中的内容
String regxpForEmbedTag = "<\\s*img\\s+([^>]*)\\s*/>";
Matcher matcher = Pattern.compile(regxpForEmbedTag).matcher(content);
StringBuffer sb = new StringBuffer();
//find:只要字符串的部分如果撇配成功就返回true
while (matcher.find()) {
//0表示整个串 , 1表示第一个括号里的内容,以此类推 该括号指的是正则表达式中的括号
String contentTemp = matcher.group(1);
System.out.println(contentTemp);
if (!contentTemp.contains("height")){
contentTemp = replaceContentByPartten(contentTemp,
"contenteditable=\"false\"", "contenteditable=\"false\"" + " width=\"358\"" + " height=\"264\"");
}else {
contentTemp = replaceContentByPartten(contentTemp,
"width=\"([^ ]+)\"", "width=\"358\"");
contentTemp = replaceContentByPartten(contentTemp,
"height=\"([^ ]+)\"", "height=\"264\"");
}
matcher.appendReplacement(sb, "<img "+ contentTemp + "/>");
}
matcher.appendTail(sb);
System.out.println(sb.toString());
}
public static String replaceContentByPartten(String content,
String partten, String target) {
Matcher matcher = Pattern.compile(partten, Pattern.CASE_INSENSITIVE).matcher(content);
if (matcher.find()) {
StringBuffer temp = new StringBuffer();
matcher.appendReplacement(temp, target);
matcher.appendTail(temp);
return temp.toString();
} else {
return content;
}
}
总结:
1、思路:
①本质是字符串,首先想到的是字符串操作(正则表达式)
②特殊的字符串:标签语句——用json工具包
2、由于可能存在多个标签,所以需要使用machter中的group()方法