使用正则表达式处理html标签方案分享

首先呢,阅读本文前建议大家去读下这篇文章点击打开链接,是关于java正则工具类Matcher相关的一些探讨和建议

下面这是其中一项关于处理匹配内容替换的范例,

appendReplacement() + appendTail()组合

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class MatcherReplaceExample {

    public static void main(String[] args) {

        String text    =
                  "John writes about this, and John Doe writes about that," +
                          " and John Wayne writes about everything."
                ;

        String patternString1 = "((John) (.+?)) ";

        Pattern      pattern      = Pattern.compile(patternString1);
        Matcher      matcher      = pattern.matcher(text);
        StringBuffer stringBuffer = new StringBuffer();

        while(matcher.find()){
            matcher.appendReplacement(stringBuffer, "Joe Blocks ");
            System.out.println(stringBuffer.toString());
        }
        matcher.appendTail(stringBuffer);

        System.out.println(stringBuffer.toString());
    }
}

在这里和大家分享本人写的一个工具类,使用正则表达式处理一些常用html标签,这种标签其实可以定制,只需找出与其匹配的正则表达式,然后按照推荐处理方案去处理即可

package com.jieve.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @ClassName: HtmlRegexpUtil
 * @Description: 处理html标签
 * @author YYYong
 * @date 2016年5月18日 上午9:26:28
 *
 */
public class HtmlRegexpUtil
{

	private final static String regxpForHtml = "<([^>]*)>"; // 过滤所有以<开头以>结尾的标签

	private final static String rexImgTag = "<(img.*?)(class.*?)(src.*?)>";   // 找出IMG标签

	private final static String regExpTag = "<(img.*?)(src.*?)(alt.*?)(title.*?)(height.*?)>"; // 找出表情标签

	private final static String regATag = "(<(a.*?href=.*?)>(.*?)</a>)"; // 找出<a>标签

	public final static String regSpanTag = "<(span.*?)(style.*?)>(.*?)</span>"; // 找出<span></span>标签

	public final static String regStrongTag = "(<(a.*?href=.*?)>(.*?)</a>)"; // 找出<strong></strong>标签

	private final static String spanTagPre = "<span style=\"text-decoration:underline;\">"; // 找出<span>标签

	private final static String spanTagSuf = "</span>"; // 找出<span>标签

	private final static String strongTagPre = "<strong>"; // 找出<strong>标签

	private final static String strongTagSuf = "</strong>"; // 找出<strong>标签

	/**
	 * @Title: handleImgTag
	 * @Description: 处理IMG标签
	 * @param @param str
	 * @param @param prefix
	 * @param @param suffix
	 * @param @return 设定文件
	 * @return String 返回类型
	 * @throws
	 */
	public static String handleImgTag(String str, String prefix, String suffix)
	{

		Pattern pattern = Pattern.compile(rexImgTag);
		Matcher matcher = pattern.matcher(str);
		StringBuffer sb = new StringBuffer();
		boolean result = matcher.find();
		while (result)
		{
			String temp = matcher.group(3);
			temp = temp.substring(6);
			matcher.appendReplacement(sb, prefix + temp.substring(0, temp.length() - 1) + suffix);
			result = matcher.find();
		}
		matcher.appendTail(sb);
		return sb.toString();
	}

	/**
	 * @Title: handleExpTag
	 * @Description: 处理表情标签
	 * @param @param str
	 * @param @param prefix
	 * @param @param suffix
	 * @param @return 设定文件
	 * @return String 返回类型
	 * @throws
	 */
	public static String handleExpTag(String str, String prefix, String suffix)
	{

		Pattern pattern = Pattern.compile(regExpTag);
		Matcher matcher = pattern.matcher(str);
		StringBuffer sb = new StringBuffer();
		boolean result = matcher.find();
		while (result)
		{
			String temp = matcher.group(4);
			temp = temp.substring(7, temp.length() - 2);
			matcher.appendReplacement(sb, prefix + temp + suffix);
			result = matcher.find();
		}
		matcher.appendTail(sb);
		return sb.toString();
	}

	/**
	* @Title: handleATag
	* @Description: 处理<a>标签
	* @param @param str
	* @param @param prefix
	* @param @param suffix
	* @param @return    设定文件
	* @return String    返回类型
	* @throws
	*/
	public static String handleATag(String str, String prefix, String suffix)
	{

		Pattern pattern = Pattern.compile(regATag);
		Matcher matcher = pattern.matcher(str);
		StringBuffer sb = new StringBuffer();
		boolean result = matcher.find();
		while (result)
		{
			String temp = matcher.group(3);
			if(temp.startsWith("$"))
			{
				// $符号为正则特殊符号,需替换后再处理
				temp = "[@@]" + temp.substring(1, temp.length() - 1) + "[@@]";
			}
			matcher.appendReplacement(sb, prefix + temp + suffix);
			result = matcher.find();
		}
		matcher.appendTail(sb);
		return sb.toString().replace("[@@]", "$");
	}

	/**
	* @Title: removeTag
	* @Description: 移除标签
	* @param @param str
	* @param @param tag
	* @param @return    设定文件
	* @return String    返回类型
	* @throws
	*/
	public static String removeTag(String str,String tag)
	{

		int count = 2;
		if(regSpanTag.equals(tag))
		{
			count++;
		}
		Pattern pattern = Pattern.compile(tag);
		Matcher matcher = pattern.matcher(str);
		StringBuffer sb = new StringBuffer();
		boolean result = matcher.find();
		while (result)
		{
			String temp = matcher.group(count);
			matcher.appendReplacement(sb,temp);
			result = matcher.find();
		}
		matcher.appendTail(sb);
		if(count == 2)
		{

			return sb.toString().replace(strongTagPre, "").replace(strongTagSuf, "");
		}
		else
		{

			return sb.toString().replace(spanTagPre, "").replace(spanTagSuf, "");
		}

	}

	/**
	 * @Title: replaceTag
	 * @Description: 替换标记以正常显示
	 * @param @param input
	 * @param @return 设定文件
	 * @return String 返回类型
	 * @throws
	 */
	public String replaceTag(String input)
	{
		if(!hasSpecialChars(input))
		{
			return input;
		}
		StringBuffer filtered = new StringBuffer(input.length());
		char c;
		for (int i = 0; i <= input.length() - 1; i++)
		{
			c = input.charAt(i);
			switch (c)
			{
				case '<':
					filtered.append("<");
					break;
				case '>':
					filtered.append(">");
					break;
				case '"':
					filtered.append(""");
					break;
				case '&':
					filtered.append("&");
					break;
				default:
					filtered.append(c);
			}

		}
		return (filtered.toString());
	}

	/**
	 * @Title: hasSpecialChars
	 * @Description: 判断标记是否存在
	 * @param @param input
	 * @param @return 设定文件
	 * @return boolean 返回类型
	 * @throws
	 */
	public boolean hasSpecialChars(String input)
	{
		boolean flag = false;
		if((input != null) && (input.length() > 0))
		{
			char c;
			for (int i = 0; i <= input.length() - 1; i++)
			{
				c = input.charAt(i);
				switch (c)
				{
					case '>':
						flag = true;
						break;
					case '<':
						flag = true;
						break;
					case '"':
						flag = true;
						break;
					case '&':
						flag = true;
						break;
				}
			}
		}
		return flag;
	}

	/**
	 * @Title: filterHtml
	 * @Description: 基本功能:过滤所有以"<"开头以">"结尾的标签
	 * @param @param str
	 * @param @return 设定文件
	 * @return String 返回类型
	 * @throws
	 */
	public static String filterHtml(String str)
	{
		Pattern pattern = Pattern.compile(regxpForHtml);
		Matcher matcher = pattern.matcher(str);
		StringBuffer sb = new StringBuffer();
		boolean result1 = matcher.find();
		while (result1)
		{
			matcher.appendReplacement(sb, "");
			result1 = matcher.find();
		}
		matcher.appendTail(sb);
		return sb.toString();
	}

	/**
	 * @Title: fiterHtmlTag
	 * @Description: 过滤指定标签
	 * @param @param str
	 * @param @param tag
	 * @param @return 设定文件
	 * @return String 返回类型
	 * @throws
	 */
	public static String fiterHtmlTag(String str, String tag)
	{
		String regxp = "<\\s*" + tag + "\\s+([^>]*)\\s*>";
		Pattern pattern = Pattern.compile(regxp);
		Matcher matcher = pattern.matcher(str);
		StringBuffer sb = new StringBuffer();
		boolean result1 = matcher.find();
		while (result1)
		{
			matcher.appendReplacement(sb, "");
			result1 = matcher.find();
		}
		matcher.appendTail(sb);
		return sb.toString();
	}

}

测试代码:

String content = "测试测试测试测试啦啦啦啦啦啦啦啊\n测试啦啦啦啦啦啦啦啦啦阿里啦\n<a href=\"/u/9\">@梦小胖</a> \[email protected]萌二胖 \n<a href=\"/p/2317\">$贵州茅台(SH600519)$</a> \n$的上次你说的承诺(12580)$ \n<img class=\"img\" src=\"//192.168.1.20//static/img/picture/835/83592167b2d54d9496be896b94d1998b_originThu.jpg\">\n<span style=\"text-decoration:underline;\">xiaoming 下划线鲜花县</span>\n<span style=\"text-decoration:underline;\">\n</span>\n<span style=\"text-decoration:underline;\"><strong>下划线下划线加粗</strong>\n</span>";
		System.out.println("The original content : " + content);
		content = HtmlRegexpUtil.handleImgTag(content, "{{", "}}");
		System.out.println("The 1st   content : " + content);
		content = HtmlRegexpUtil.handleExpTag(content, "", "");
		System.out.println("The 2ed   content : " + content);
		content = HtmlRegexpUtil.handleATag(content, "<", ">");
		System.out.println("The 3rd   content : " + content);
		content = HtmlRegexpUtil.removeTag(content, HtmlRegexpUtil.regSpanTag);
		System.out.println("The 4th   content : " + content);
		content = HtmlRegexpUtil.removeTag(content, HtmlRegexpUtil.regStrongTag);
		System.out.println("The final content : " + content);

结果如下:

The original content : 测试测试测试测试啦啦啦啦啦啦啦啊
测试啦啦啦啦啦啦啦啦啦阿里啦
<a href="/u/9">@梦小胖</a>
@萌二胖
<a href="/p/2317">$贵州茅台(SH600519)$</a>
$的上次你说的承诺(12580)$
<img class="img" src="//192.168.1.20//static/img/picture/835/83592167b2d54d9496be896b94d1998b_originThu.jpg">
<span style="text-decoration:underline;">xiaoming 下划线鲜花县</span>
<span style="text-decoration:underline;">
</span>
<span style="text-decoration:underline;"><strong>下划线下划线加粗</strong>
</span>
The 1st   content : 测试测试测试测试啦啦啦啦啦啦啦啊测试啦啦啦啦啦啦啦啦啦阿里啦<ahref="/u/9">@梦小胖</a>@萌二胖<ahref="/p/2317">$贵州茅台(SH600519)$</a>$的上次你说的承诺(12580)${{/192.168.1.20//static/img/picture/835/83592167b2d54d9496be896b94d1998b_originThu.jpg}}<spanstyle="text-decoration:underline;">xiaoming下划线鲜花县</span><spanstyle="text-decoration:underline;"></span><spanstyle="text-decoration:underline;"><strong>下划线下划线加粗</strong></span>
The 2ed   content : 测试测试测试测试啦啦啦啦啦啦啦啊测试啦啦啦啦啦啦啦啦啦阿里啦<ahref="/u/9">@梦小胖</a>@萌二胖<ahref="/p/2317">$贵州茅台(SH600519)$</a>$的上次你说的承诺(12580)${{/192.168.1.20//static/img/picture/835/83592167b2d54d9496be896b94d1998b_originThu.jpg}}<spanstyle="text-decoration:underline;">xiaoming下划线鲜花县</span><spanstyle="text-decoration:underline;"></span><spanstyle="text-decoration:underline;"><strong>下划线下划线加粗</strong></span>
The 3rd   content : 测试测试测试测试啦啦啦啦啦啦啦啊测试啦啦啦啦啦啦啦啦啦阿里啦<@梦小胖>@萌二胖<$贵州茅台(SH600519)$>$的上次你说的承诺(12580)${{/192.168.1.20//static/img/picture/835/83592167b2d54d9496be896b94d1998b_originThu.jpg}}<spanstyle="text-decoration:underline;">xiaoming下划线鲜花县</span><spanstyle="text-decoration:underline;"></span><spanstyle="text-decoration:underline;"><strong>下划线下划线加粗</strong></span>
The 4th   content : 测试测试测试测试啦啦啦啦啦啦啦啊测试啦啦啦啦啦啦啦啦啦阿里啦<@梦小胖>@萌二胖<$贵州茅台(SH600519)$>$的上次你说的承诺(12580)${{/192.168.1.20//static/img/picture/835/83592167b2d54d9496be896b94d1998b_originThu.jpg}}xiaoming下划线鲜花县<strong>下划线下划线加粗</strong>
The final content : 测试测试测试测试啦啦啦啦啦啦啦啊测试啦啦啦啦啦啦啦啦啦阿里啦<@梦小胖>@萌二胖<$贵州茅台(SH600519)$>$的上次你说的承诺(12580)${{/192.168.1.20//static/img/picture/835/83592167b2d54d9496be896b94d1998b_originThu.jpg}}xiaoming下划线鲜花县下划线下划线加粗

作者声明:有问题请联系[email protected]

时间: 2024-08-10 21:30:33

使用正则表达式处理html标签方案分享的相关文章

备份方案 分享

备份方案 分享

正则表达式 替换 &lt;img &gt; 标签

/** * 正则表达式过滤<img > 标签 * @param str * @return */ public static String cutOutImgPrefix(String str){ String regex = "<img[^>]*>"; return str.replaceAll(regex, ""); }

用正则表达式替换指定标签中的内容

用正则表达式替换指定标签中的内容,也是在工作中遇到的就顺手记了下来 string sXML = "ABCDEFCSF<p>123123</p>KOPL";//现在我要去掉P标签中的内容,实现 ABCDEFCSFKOPL这样的效果. 引入:using System.Text.RegularExpressions; Regex rg = new Regex("<pict>.*</pict>"); sXML = rg.Rep

序列标注中的几种标签方案

标签说明 标签方案中通常都使用一些简短的英文字符[串]来编码. 标签是打在token上的. 对于英文,token可以是一个单词(e.g. awesome),也可以是一个字符(e.g. a). 对于中文,token可以是一个词语(分词后的结果),也可以是单个汉字字符. 为便于说明,以下都将token试作等同于字符. 标签列表如下: B,即Begin,表示开始 I,即Intermediate,表示中间 E,即End,表示结尾 S,即Single,表示单个字符 O,即Other,表示其他,用于标记无关

java正则表达式去除html标签

当我们用ckeditor或其他一些在线文本编辑器的时候 内容里会有很多的标签 如下片段: <p><img alt="" src="/img/uploadImg/20131218/0fd741e1-cc75-459c-a8b5-bbaebcfcc637.jpg" style="height:494px; width:460px" /></p> <p>生命的旅途,一程有一程的风景,一程有一程的盛放.打开

c#并行任务多种优化方案分享(异步委托)

遇到一个多线程任务优化的问题,现在解决了,分享如下. 假设有四个任务: 任务1:登陆验证(CheckUser) 任务2:验证成功后从Web服务获取数据(GetDataFromWeb) 任务3:验证成功后从数据库获取数据(GetDatFromDb) 任务4:使用2.3的数据执行一个方法 (StartProcess) 一个比较笨的方法(本人最开始的方法,记为方法1)是直接开启一个线程,按照顺序依次执行四个任务: new Thread(delegate                {        

java正则表达式过滤html标签(转)

import java.util.regex.Matcher; import java.util.regex.Pattern; /** * <p> * Title: HTML相关的正则表达式工具类 * </p> * <p> * Description: 包括过滤HTML标记,转换HTML标记,替换特定HTML标记 * </p> * <p> * Copyright: Copyright (c) 2006 * </p> * * @auth

旅游行业GIS应用方案分享

旅游地理信息系统(Travel GeographicInformation System, 简称TGIS) 是以旅游地理信息数据库为基础, 在计算机硬软件支持下, 运用系统工程和信息科学的理论和方法, 综合地.动态地获取.存储.管理.分析和应用旅游地理信息的多媒体信息系统.旅游信息系统的建立, 将以其快速高效收集.存储.整理.输出.查.询.检索等功能来提高旅游决策效率, 更以其优越的空间分析功能使旅游规划更为科学. 旅游与地理信息相关性极强,GIS 中如图形.区域景观资源信息.交通路线等诸多要素

第四届拍拍贷魔镜杯冠军方案分享

## 1.介绍 ? 队员:@回头是岸,@林萧, @观想,作者:@[一休](https://www.zhihu.com/people/qlmx-61/activities) ## 2. 赛题背景 资金流动性管理迄今仍是金融领域的经典问题.在互联网金融信贷业务中,单个资产标的金额小且复杂多样,对于拥有大量出借资金的金融机构或散户而言,资金管理压力巨大,精准地预测出借资金的流动情况变得尤为重要.本次比赛以互联网金融信贷业务为背景,以<现金流预测>为题,希望选手能够利用我们提供的数据,精准地预测资产组