首页 > 代码库 > 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> 标签 保证闭合