求助 , java 正则去除部分html标签问题
有一段html标签, 我要去除里面 “image” 和 “netVideo” 以外的所有其他标签,下面的方式去不干净, 如果标签的首字母是 image|netVideo 其中的一个,那么这个标签就去除不掉, 请问这个正则表达式该怎么写啊 ,各位大侠请不吝指点public static void main(String[] args)
{
String s = "<div align=\"left\">sad</div><P>ss<P>a<image src=''/> ss";
String reg = "<[^image|netVideo][^>]*>";
System.out.println(s.replaceAll(reg, ""));
}
实际输出: <div align="left">sadssa<image src=''/> ss
预期输出: sadssa<image src=''/> ss
--------------------编程问答--------------------
String html = "<div align=\"left\">sad</div><P>ss<P>a<image src=''/> ss<newVideo \r\n abc='xyz'>sss</newVideo> abc <Image>xxx</IMAGE>";
String regex = "(?id)</?+(?!image|newVideo).*?>";
System.out.println(html.replaceAll(regex, ""));
如果需要区分大小写,把(?id)变成(?d) --------------------编程问答-------------------- 当然,没考虑<!--注释--> --------------------编程问答-------------------- 注释<!--注释--> 也需要过滤掉
"(?id)</?+(?!image|newVideo).*?>" 这种写法没见过啊, 是不是java自己的正则写法, 不是通用的方式(才疏学浅, 莫笑话啊)
我采用了种子较负责的方式,
--------------------编程问答-------------------- 注释<!--注释--> 也需要过滤掉
"(?id)</?+(?!image|newVideo).*?>" 这种写法没见过啊, 是不是java自己的正则写法, 不是通用的方式(才疏学浅, 莫笑话啊)
我采用了种较负责的方式, 不过不是很喜欢这种, 希望能用一个语句来实现
public static String removeLab(String content)
{
if (content == null || "".equals(content.trim()))
{
return "";
}
StringBuffer sb = new StringBuffer();
Pattern p = Pattern.compile("<[^>]*>");
Matcher m = p.matcher(content.replaceAll("\\&[a-zA-Z]{1,10};", ""));
while (m.find())
{
String tmp = m.group();
m.appendReplacement(sb, "");
if (tmp.startsWith("<image") || tmp.startsWith("<netVideo"))
{
sb.append(tmp);
}
}
m.appendTail(sb);
return sb.toString().trim();
}
--------------------编程问答-------------------- 话说,我这个是不是Java的,你倒是用Java运行下看看啊
注释的做法是,先正则匹配注释,把注释先保存,然后把注释用很安全的占位符先替换掉,然后再用前面我的正则替换掉。最后,用保存下来的注释替换掉之前的占位符。
比如
<!-- START -->
<div align="left">sadssa<image src=''/> ss
<!--
END
-->
先用Map保存
__COMMENT_PLACEHOLDER_0 = "<!-- START -->"
__COMMENT_PLACEHOLDER_1 = "<!-- \r\nEND\r\n -->"
然后把文本替换为
__COMMENT_PLACEHOLDER_0
<div align="left">sadssa<image src=''/> ss
__COMMENT_PLACEHOLDER_1
最后用我前面写的正则替换成
__COMMENT_PLACEHOLDER_0
sadssa<image src=''/> ss
__COMMENT_PLACEHOLDER_1
在把Map里面的占位符替换回去
<!-- START -->
sadssa<image src=''/> ss
<!--
END
--> --------------------编程问答-------------------- [^image|netVideo] = [^imagentVdo]
貌似表示匹配i,m,a,g,e,n,e,t,V,i,d,e,o外的字符,而不是“image”和“netVideo”外的字符串 --------------------编程问答-------------------- 太高兴了,弄了好久没弄出来,太感谢lz和school104了
补充:Java , Java SE