当前位置:编程学习 > JAVA >>

求助 , 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
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,