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


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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值