正则匹配字符串中所有a标签

简介: 简述利用正则取出一段字符串中的所有a标签

需求背景

对于线上的富文本内容,由于富文本内容中存在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>

正则匹配的结果如图

image.png

正则在线校验地址:http://www.jsons.cn/reg/ 根据校验结果来看的话,富文本内容实际是有4个a标签,但是当前正则只能匹配出其中的3个a标签,对于空内容的a标签并不能匹配,那么应是 \bhref="([^"]*)" : 匹配a标签的href属性,其中“\b”用于确保匹配到单个单词  的原因,那么我们再尝试修改一下正则表达式

<a\s*?[^>]*?/?>(.*?</a>)?

修改正则后我们进行正则匹配就可以看到如图

image.png

这时即使是没有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);
    }

返回结果如图

image.png

这样就实现了我们想要取出富文本内容中的所有a标签并对a标签增加 target="_blank" 属性再放回去的目的。

相关文章
|
6月前
|
JavaScript 前端开发
用JavaScript正则表达式匹配对应字符串高亮显示,并过滤掉空格、<、>等HTML节点符号
用JavaScript正则表达式匹配对应字符串高亮显示,并过滤掉空格、<、>等HTML节点符号
|
JavaScript 前端开发 索引
javascript截取两个符号之间的字符串(2):lastIndexOf匹配和正则表达式匹配
javascript截取两个符号之间的字符串(2):lastIndexOf匹配和正则表达式匹配
406 0
|
JavaScript 数据库
Jquery 正则匹配字母、数字、-
简要简述Jquery正则基础用法
|
11月前
正则匹配常见字符串
正则匹配常见字符串
46 0
|
数据采集
正则表达式匹配html标签,获取标签内容
正则表达式匹配html标签,获取标签内容
|
JavaScript
如何让html标签不转义
如何让html标签不转义
118 0
|
JavaScript
JS:正则RegExp对象匹配中文汉字
JS:正则RegExp对象匹配中文汉字
149 0
|
JSON 数据格式
用正则表达式给字符串属性值都加上双引号
需要处理的字符串 [{columnDisplaySize=8, columnName=WARD_CODE, columnTypeName=varchar}, {columnDisplaySize=11, columnName=BED_NO, columnTypeName=int},[{columnD...
2088 0