标签:java处理html 处理p使其闭合 html p 标签处理
需求:
处理一段html代码中<p>标签,使其不嵌套,闭合,无内容暴露在标签之外
例如:
11111<p></p>22222<p>33333</p><p>44444</p>555555<p></p>66666
思维导图:
代码:
public static String checkpp(String content){
String Str;
int time =0;
int pos =0;
int path =0;
boolean flag =true;
int index1 =0;
int index2 =0;
//保证首尾位置分别为<p>和</p>
int firstindex = content.indexOf("<p>");
if(firstindex !=0){
content = "<p>"+content;
}
int lastindex = content.lastIndexOf("</p>");
if(lastindex != content.length()-4 || lastindex == -1){
content = content +"</p>";
}
StringBuffer sb = new StringBuffer(content);
do{
time++;
System.out.println("-------"+time+"----- path:"+path);
switch(path){
case 0:
index1 =sb.indexOf("<p>",pos+1);
index2 =sb.indexOf("</p>",pos+1);
System.out.println(sb.toString());
System.out.println("pos:"+pos);
System.out.println("index1:"+index1);
System.out.println("index2:"+index2);
if(index1 != -1){
if(index2<index1){ // <p></p>
path = 1;
pos = index2;
}else{ // <p>(...)*<p> → <p>(xxx)*</p><p>
sb = sb.insert(index1, "</p>");
path = 0;
pos = index1+4;
}
}else{ // no more <p> but it's not end yet:<p>(...</p>)*</p>
path = 1;
pos = index2;
}
break;
case 1:
index1 =sb.indexOf("<p>",pos+1);
index2 =sb.indexOf("</p>",pos+1);
System.out.println(sb.toString());
System.out.println("pos:"+pos);
System.out.println("index1:"+index1);
System.out.println("index2:"+index2);
//no more </p> exit
if(index2 == -1){
flag = false;
break;
}
//no more <p> but not end
if(index1 == -1){
sb = sb.insert(pos+4, "<p>");
path =0;
pos = pos + 7;
break;
}else{
/* </p>(....)*<p>
* ↑
* pos
*/
if(index1<index2){
if(index1 - pos > 4){ // </p>(xxx)<p> → </p><p>(xxx)</p><p>
sb = sb.insert(pos+4, "<p>");
sb = sb.insert(index1+3, "</p>");
path = 0;
pos = index1 +7;
}else if(index1 - pos == 4){ // </p><p>
path = 0;
pos = index1;
}
}else{ //</p>(....)*</p> → </p><p>(...)*</p>
sb = sb.insert(pos+4, "<p>");
path = 1;
pos = index2 +3;
}
break;
}
default:
break;
}
System.out.println("pos:"+pos);
System.out.println(sb.toString());
//exit
if(pos == sb.length()-4)
break;
}while(flag);
Str =sb.toString();
Str= Str.replaceAll("<p>(\\s)*( )*( )*</p>", "");
return Str;
}11111<p></p>22222<p>33333</p><p>44444</p>555555<p></p>66666 -------1----- path:0 <p>11111<p></p>22222<p>33333</p><p>44444</p>555555<p></p>66666</p> pos:0 index1:8 index2:11 pos:12 <p>11111</p><p></p>22222<p>33333</p><p>44444</p>555555<p></p>66666</p> -------2----- path:0 <p>11111</p><p></p>22222<p>33333</p><p>44444</p>555555<p></p>66666</p> pos:12 index1:24 index2:15 pos:15 <p>11111</p><p></p>22222<p>33333</p><p>44444</p>555555<p></p>66666</p> -------3----- path:1 <p>11111</p><p></p>22222<p>33333</p><p>44444</p>555555<p></p>66666</p> pos:15 index1:24 index2:32 pos:31 <p>11111</p><p></p><p>22222</p><p>33333</p><p>44444</p>555555<p></p>66666</p> -------4----- path:0 <p>11111</p><p></p><p>22222</p><p>33333</p><p>44444</p>555555<p></p>66666</p> pos:31 index1:43 index2:39 pos:39 <p>11111</p><p></p><p>22222</p><p>33333</p><p>44444</p>555555<p></p>66666</p> -------5----- path:1 <p>11111</p><p></p><p>22222</p><p>33333</p><p>44444</p>555555<p></p>66666</p> pos:39 index1:43 index2:51 pos:43 <p>11111</p><p></p><p>22222</p><p>33333</p><p>44444</p>555555<p></p>66666</p> -------6----- path:0 <p>11111</p><p></p><p>22222</p><p>33333</p><p>44444</p>555555<p></p>66666</p> pos:43 index1:61 index2:51 pos:51 <p>11111</p><p></p><p>22222</p><p>33333</p><p>44444</p>555555<p></p>66666</p> -------7----- path:1 <p>11111</p><p></p><p>22222</p><p>33333</p><p>44444</p>555555<p></p>66666</p> pos:51 index1:61 index2:64 pos:68 <p>11111</p><p></p><p>22222</p><p>33333</p><p>44444</p><p>555555</p><p></p>66666</p> -------8----- path:0 <p>11111</p><p></p><p>22222</p><p>33333</p><p>44444</p><p>555555</p><p></p>66666</p> pos:68 index1:-1 index2:71 pos:71 <p>11111</p><p></p><p>22222</p><p>33333</p><p>44444</p><p>555555</p><p></p>66666</p> -------9----- path:1 <p>11111</p><p></p><p>22222</p><p>33333</p><p>44444</p><p>555555</p><p></p>66666</p> pos:71 index1:-1 index2:80 pos:78 <p>11111</p><p></p><p>22222</p><p>33333</p><p>44444</p><p>555555</p><p></p><p>66666</p> -------10----- path:0 <p>11111</p><p></p><p>22222</p><p>33333</p><p>44444</p><p>555555</p><p></p><p>66666</p> pos:78 index1:-1 index2:83 pos:83 <p>11111</p><p></p><p>22222</p><p>33333</p><p>44444</p><p>555555</p><p></p><p>66666</p> <p>11111</p><p>22222</p><p>33333</p><p>44444</p><p>555555</p><p>66666</p>
分析:
1.由于只涉及<p></p>,就可以将<p>和</p>作为两个状态来处理,思维导图见上,从左至右处理字符串。
2.将String转化成StringBuffer,便于执行插入操作。
3.使用外层do while内层switch方式遍历。
4.使用pos记录当前目标位置。
5.使用flag,当在swtich中触发终止条件时,将其设为false,再break,这样便可终止。
6.触发终止信号:a.当前pos位于最后一个</p>处,这个条件对于两个状态都适用; b.当前pos节点 向后遍历 没有</p> 出现,证明这是最后一个</p>,即结尾。
注:因为<p>状态非结尾状态,因此不能直接从switch的case 0中实现退出,只能跳转到case 1。
标签:java处理html 处理p使其闭合 html p 标签处理
原文地址:http://blog.csdn.net/geeklei/article/details/40867171