`
zuzong
  • 浏览: 112366 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

过滤掉非指定保留的html元素,保留元素间的内容和指定的html

    博客分类:
  • java
阅读更多
public static void main(String[] args) 

	    /**
		 * 过滤掉非指定保留的html元素,保留元素间的内容和指定的html。
		 * 
		 * 这个方法没有对缺失的或未闭合的html元素做处理,
		 * 是假设字符串中的TYPE_CLASS、TYPE_CLASS1、SPAN标签都符合规范,
		 * 代码思路是让一个新建的StringBuffer类来保存过滤出来字符,
		 * 当遇到‘<’ 或 ‘>’时,截取当前位置后面或前面的字符串,并与指定保留的元素字符串进行比较,根据判断进行保存
		 */
		final String TYPE_CLASS = "span class=\"type-class\"";
		final int TYPE_CLASS_LENGTH = TYPE_CLASS.length();
		final String TYPE_CLASS1 = "span class=\"type-class1\"";
		final int TYPE_CLASS_LENGTH1 = TYPE_CLASS1.length();
		final String SPAN = "span";
		final int SPAN_LENGTH = SPAN.length();
		final String SPAN_OFF = "</span>";
		final int SPAN_OFF_LENGTH = SPAN_OFF.length();
		
		String str = 
			"sustained by <a href=\"http://www.springsource.com\">SpringSource</a>" +
			" O(∩_∩)O哈哈~ <span class=\"type-class\">type-class</span>" +	
			", Spring delivers <span class=\"aaaaa\">SpringSource2</span>" +
				"。< <span class=\"type-class1\">type->class1</span>啊啊";
		
		StringBuffer sb = new StringBuffer(str.length());
		boolean charBool = true; // 表示是否保存此字符
		boolean tagBool = false; // 表示前面是否是指定保留的元素
		
		for(int i=0; i<str.length(); i++){
			char c = str.charAt(i);
			if(c == '<'){
				charBool = false;
				String span = "";
				String span1 = "";
				/*
				 * TYPE_CLASS、TYPE_CLASS1中最长的那个标签的长度,小于字符串长度时,才于截取并赋值
				 * 否则,会是原在上面赋值的空串,作用是防止处理到字符串最后时,截取越界
				 */
				if(i+1+TYPE_CLASS_LENGTH1 < str.length()){
					span = str.substring(i+1, i+1+TYPE_CLASS_LENGTH);
					span1 = str.substring(i+1, i+1+TYPE_CLASS_LENGTH1);
				}
				String spanoff = str.substring(i, i+SPAN_OFF_LENGTH);
				
				if(span.equalsIgnoreCase(TYPE_CLASS)
						|| span1.equalsIgnoreCase(TYPE_CLASS1)){
					tagBool = true; //这里的作用是当下一次的c == '<' </span>出现时,让下面的spanoff判断能执行
					charBool = true;
					sb.append(c);
				}
				
				// 判断是否指定保留元素的关闭标签,并配合tagBool,判断前面是否是指定保留元素,是则保存,以闭合元素
				if(spanoff.equalsIgnoreCase(SPAN_OFF) && tagBool){
					charBool = true;
					sb.append(c);
					tagBool = false;
				}
				
			}else if(c == '>'){
				
				// 当元素结束时,判断是否是指定保留元素,是,则保存‘>’符
				if(charBool)
					sb.append(c);
				
				// 当元素结束时,打开charBool,保存元素外的内容
				charBool = true;
				
			}else if(charBool){// true时,说明字符不在元素"<???>"里,是元素之间的内容,保存
				sb.append(c);
			}
		}
		
		System.out.println(sb);
1
7
分享到:
评论
2 楼 zuzong 2011-03-05  
写的时候,考虑过用indexof查一次,删一次,后来写着写着就不往这方面想了,晕 
1 楼 zuzong 2011-03-05  
我一开始用的stringbuffer,发现删除了那些不需要的html,但length还是以前的,也就是delete操作,只改变了缓冲区的数据,没刷到源里

相关推荐

    C#正则过滤HTML标签并保留指定标签的方法

    主要介绍了C#正则过滤HTML标签并保留指定标签的方法,涉及C#针对页面HTML元素正则匹配与替换相关操作技巧,需要的朋友可以参考下

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    本人电子文档的内容和纸质论文的内容相一致。除在保密期内的保密论文和在技术保护期限内的论文外,允许论文被查阅和借阅,可以公布(包括以电子信息形式刊登)论文的全部内容或中、英文摘要等部分内容。论文的公布...

    Python Cookbook

    12.9 过滤属于指定命名空间的元素和属性 455 12.10 用SAX合并连续的文本事件 458 12.11 使用MSHTML来解析XML或HTML 461 第13章 网络编程 462 引言 462 13.1 通过Socket数据报传输消息 464 13.2 从Web抓取文档...

    jQuery完全实例.rar

    动态创建一个 div 元素(以及其中的所有内容),并将它追加到 body 元素中。在这个函数的内部,是通过临时创建一个元素,并将这个元素的 innerHTML 属性设置为给定的标记字符串,来实现标记到 DOM 元素转换的。所以...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    2.2 名称空间在元素和属性中的运用 39 2.2.1 名称空间在元素中的运用 39 2.2.2 默认名称空间 41 2.2.3 名称空间在属性中的运用 42 2.3 名称空间和dtd 43 2.4 小结 45 第3章 对xml文档进行分析 46 3.1 dom、...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    2.2 名称空间在元素和属性中的运用 39 2.2.1 名称空间在元素中的运用 39 2.2.2 默认名称空间 41 2.2.3 名称空间在属性中的运用 42 2.3 名称空间和dtd 43 2.4 小结 45 第3章 对xml文档进行分析 46 3.1 dom、...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    2.2 名称空间在元素和属性中的运用 39 2.2.1 名称空间在元素中的运用 39 2.2.2 默认名称空间 41 2.2.3 名称空间在属性中的运用 42 2.3 名称空间和dtd 43 2.4 小结 45 第3章 对xml文档进行分析 46 3.1 dom、...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    2.2 名称空间在元素和属性中的运用 39 2.2.1 名称空间在元素中的运用 39 2.2.2 默认名称空间 41 2.2.3 名称空间在属性中的运用 42 2.3 名称空间和dtd 43 2.4 小结 45 第3章 对xml文档进行分析 46 3.1 dom、...

    freemarker总结

    options:该参数可以省略,指定包含时的选项,包含encoding和parse两个选项,其中encoding指定包含页面时所用的解码集,而parse指定被包含文件是否作为FTL文件来解析,如果省略了parse选项值,则该选项默认是true. ...

    delphi EhLib 9.5.012 Full Source 专业版 .rar

    元素分支和本身是其他父母记录的元素。 组件TDBGridEh支持显示这些组件的树型结构 记录。 允许连接到其他TMemTableEh的内部阵列(通过 ExternalMemData属性)并使用其数据:排序,过滤,编辑。 具有用于在...

    Java面试宝典2020修订版V1.0.1.doc

    40什么是检查性异常和非检查性异常? 23 41、Java的异常处理机制是什么? 23 42、一个静态方法,里面可不可以用this和super关键字 24 三、JavaScript/JQuery/Ajax部分 24 1、用js和jQuery怎么进行表单验证 24 3、...

    python cookbook(第3版)

    1.16 过滤序列元素 1.17 从字典中提取子集 1.18 映射名称到序列元素 1.19 转换并同时计算数据 1.20 合并多个字典或映射 第二章:字符串和文本 2.1 使用多个界定符分割字符串 2.2 字符串开头或结尾匹配 2.3...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    本书是第II卷,以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Java进行桌面程序开发各个方面的知识和技巧,主要包括Java语法与面向对象技术、Java高级应用、窗体与控件应用、文件操作...

    Zoomla!逐浪CMS2 x3.9.6.zip

    8、修复:内容列表--生成Html BUG,生成发布时,过滤未审核内容 9、增加:通用排序页,已用于模型字段,内容,商品(支持拖动排序) 10、优化:引入BootStrap多选框,用于替代checkbox 11、新增:svg工具,支持面向base64\...

    大名鼎鼎SWFUpload- Flash+JS 上传

     在SWFUpload的使用过程中,无论在客户端还是服务器端都要和File Object打交道,在一个File Object中包含了以下内容:  {  id : string, // SWFUpload file id, used for starting or cancelling and upload  ...

Global site tag (gtag.js) - Google Analytics