需求背景
对于线上的富文本内容,由于富文本内容中存在a标签,这个时候需要对富文本内容中的所有a标签增加 target="_blank" 属性,那么就需要通过正则来匹配富文本内容中的所有a标签,并取出,然后再对取出的a标签附上 target="_blank" 属性后再替换回去。基于这个思路,下面开始我们的操作。
正则取出a标签
首先提供一下富文本的内容
<table class="crm_list_tab3 clearfix"style="table-layout: fixed;"> <thead> <tr> <td width="20%">保存时间</td> <td width="60%">解决方案</td> <td width="20%">坐席</td> </tr> </thead> <tbody id="solution"style=""> <tr id="last"style=""> <td id="createDate"style="width: 20%;">2023-07-20 11:10:23</td> <td style="width: 60%; height: 50px;"id="solTd"> <p style="text-wrap: wrap;">初级万人模考活动现已上线,活动链接如下:<a target="_blank"href="https://abc.test.com/hd/cjks/2022-mk/?sac=CGHD230411255-0">有target</a> <br> <a target="_blank"href="https://abc.test.com/hd/cjks/2022-mk/?sac=CGHD230433678-0">没target</a> </p> <p style="text-wrap: wrap;"> <br> </p> <p style="text-wrap: wrap;">APP:第一次模考开放时间4.13-4.17日,暂无视频解析</p> <p> <img src="http://abc.test.com/test_crm/image/2022/7/20/1689822582389_1_871952435ad14c2aa0518cc0118a002f8.jpg"title="1689822589768047955.jpg"alt="dog.jpg"> </p> <p> <img src="http://abc.test.com/test_crm/image/2022/7/20/16898225225667_1_7bd32d54bff345f09e967321eb0b68d9.png"title="1689822599665067032.png"alt="image.png"> </p> <p style="line-height: 16px;"> <img src="http://abc.test.com/admin/ueditor/dialogs/attachment/fileTypeImages/icon_jpg.gif"> <a target="_blank"style="font-size:12px; color:#0066cc;"href="http://abc.test.com/test_crm/file/2022/7/20/1689822613359_1_7f7ba29c816043f6bce67195616877c0.jpg"title="微信图片_20200518174247.jpg">微信图片_20200518174247.jpg</a> </p> <p> <br> </p> <p><a></a></p> </td> <td style="width: 20%;">admin</td> </tr> </tbody> </table>
基于以上富文本的内容,通过正则取出其中的a标签,首先我们测试一下正则
<a\b[^>]+\bhref="([^"]*)"[^>]*>([\s\S]*?)</a>
正则匹配的结果如图
正则在线校验地址:http://www.jsons.cn/reg/ 根据校验结果来看的话,富文本内容实际是有4个a标签,但是当前正则只能匹配出其中的3个a标签,对于空内容的a标签并不能匹配,那么应是 \bhref="([^"]*)" : 匹配a标签的href属性,其中“\b”用于确保匹配到单个单词 的原因,那么我们再尝试修改一下正则表达式
<a\s*?[^>]*?/?>(.*?</a>)?
修改正则后我们进行正则匹配就可以看到如图
这时即使是没有href的a标签也被正则匹配出来了,那么我们就可以用这个正则来匹配富文本中的所有a标签了。
Java获取所有a标签
正则验证之后,我们就可以写Java代码来取出富文本内容中的所有a标签,并对没有target="_blank" 属性的a标签增加 target="_blank" 属性
publicstaticvoidmain(String[] args) { Stringresult="<table class=\"crm_list_tab3 clearfix\" style=\"table-layout: fixed;\"><thead><tr><td width=\"20%\">保存时间</td><td width=\"60%\">解决方案</td><td width=\"20%\">坐席</td></tr></thead><tbody id=\"solution\" style=\"\"><tr id=\"last\" style=\"\"><td id=\"createDate\" style=\"width: 20%;\">2023-07-20 11:10:23</td><td style=\"width: 60%; height: 50px;\" id=\"solTd\"><p style=\"text-wrap: wrap;\">初级万人模考活动现已上线,活动链接如下:<a target=\"_blank\" href=\"https://abc.test.com/hd/cjks/2022-mk/?sac=CGHD230411255-0\">有target</a><br><a href=\"https://abc.test.com/hd/cjks/2022-mk/?sac=CGHD230433678-0\">没target</a></p><p style=\"text-wrap: wrap;\"><br></p><p style=\"text-wrap: wrap;\">APP:第一次模考开放时间4.13-4.17日,暂无视频解析</p><p><img src=\"http://abc.test.com/test_crm/image/2022/7/20/1689822582389_1_871952435ad14c2aa0518cc0118a002f8.jpg\" title=\"1689822589768047955.jpg\" alt=\"dog.jpg\"></p><p><img src=\"http://abc.test.com/test_crm/image/2022/7/20/16898225225667_1_7bd32d54bff345f09e967321eb0b68d9.png\" title=\"1689822599665067032.png\" alt=\"image.png\"></p><p style=\"line-height: 16px;\"><img src=\"http://abc.test.com/admin/ueditor/dialogs/attachment/fileTypeImages/icon_jpg.gif\"><a style=\"font-size:12px; color:#0066cc;\" href=\"http://abc.test.com/test_crm/file/2022/7/20/1689822613359_1_7f7ba29c816043f6bce67195616877c0.jpg\" title=\"微信图片_20200518174247.jpg\">微信图片_20200518174247.jpg</a></p><p><br></p><p><a></a></p></td><td style=\"width: 20%;\">admin</td></tr></tbody></table>"; Patterncompile=Pattern.compile("<a\\s*?[^>]*?/?>(.*?</a>)?"); Matchermatcher=compile.matcher(result); while (matcher.find()) { // 匹配到的a标签StringaTag=matcher.group(); System.out.println("加属性前:"+aTag); //判断当前a标签内容是否包含target="if (aTag.indexOf("target=\"") ==-1) { Stringreplace=aTag.replace("<a", "<a target=\"_blank\" "); System.out.println("加属性后:"+replace); result=result.replace(aTag,replace); } } System.out.println(result); }
返回结果如图
这样就实现了我们想要取出富文本内容中的所有a标签并对a标签增加 target="_blank" 属性再放回去的目的。