//原始字段数据其中包含<img src="/web/A02024092033333.JPG"> 替换为<img src="/web/A0202409/A020240920/A02024092033333.JPG">
@PostMapping("xxx")
public ResultVo<?> xxx(@RequestParam String channelCode){//是通过对应栏目编码来进行替换
ContentDetail contentDetail = contentDetailService.findByChannelCode(channelCode);
String content = contentDetail.getContent();//找到对应的字段
Pattern pattern = Pattern.compile("<img\\s+[^>]*src=\"([^\"]+)\"");//使用正则表达式创建一个Pattern对象。这个正则表达式用于匹配<img>标签,并捕获其src属性的值。
Matcher matcher = pattern.matcher(content);//创建一个Matcher对象,用于在给定的content字符串中查找与上述正则表达式匹配的内容。
StringBuffer updatedContent = new StringBuffer();
while (matcher.find()) {//在content中查找下一个匹配的<img>标签,循环执行直到没有匹配项。
String src = matcher.group(1);//从当前匹配的内容中提取src属性的值(这是正则表达式中第一个捕获组([^\"]+))。
String newSrc = src; // 默认新的src为原始src
if (src.startsWith("/web") || src.startsWith("/wweb")) {
String filename = src.substring(src.lastIndexOf('/') + 1);//从src中提取文件名,方法是找到最后一个/的位置,并从此位置开始截取字符串。
String base = filename.substring(0, filename.lastIndexOf('.'));//获取文件名的基础部分,去掉扩展名(例如.JPG)。这是通过找到最后一个.的位置并进行截取来实现的。
// 如果src符合特定格式,进行拆分
if (src.matches(".*/W\\d+\\.JPG")) {检查src是否符合特定格式,即是否包含以W开头,后跟10个数字并以.JPG结尾的文件名。
String part1 = base.substring(0, 7); // 这块我是截取的前7位为二级目录
String part2 = base.substring(0, 9); // 前9位为三级目录
newSrc = "/" + part1 + "/" + part2 + "/" + filename;//生成新的src路径,将其构造为/part1/part2/filename的形式。
System.out.println("newSrc:"+newSrc);
}
}
// 替换原始src为新的src
matcher.appendReplacement(updatedContent, matcher.group(0).replace(src, newSrc));
}
matcher.appendTail(updatedContent); // 添加未匹配部分
// 更新contentDetail的content
contentDetail.setContent(updatedContent.toString());
contentDetailService.updateById(contentDetail); // 更新数据库或持久化
// 返回结果
return ResultVo.success(updatedContent.toString());
}
正则表达式:
"<img\\s+[^>]*src=\"([^\"]+)\"":
<img:匹配以<img开头的字符串。
\\s+:匹配一个或多个空格(可能的空白字符)。
[^>]*:匹配任意数量的非>字符,代表其他可能的属性。
src=\"([^\"]+)\":
src=\":匹配src="部分。
([^\"]+):捕获组,用于提取src属性中的值(即双引号之间的内容)。
\":匹配关闭的双引号。