首页 > 代码库 > java 处理html代码 中<p> 标签 保证闭合
java 处理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; }
执行例子的log:
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> 标签 保证闭合
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。