第一步 将非p br img a标签去掉
str = str.replace(/<(?!p|br|img|a(?=[\s>])|/p|/a)[^>]*>/ig,"");
第二步 标签合法性修改
str = str.replace(/<(p|img)[^>]*>/,"<$1>");

解决方案 »

  1.   

    不小心按到提交了 继续:
    var re = /<img[^>]*?(?:(?:(src\s*=\s*["']?[^"'\s>]*["']?)|(alt\s*=\s*["']?[^"'\s>]*["']?)|(width\s*=\s*["']?[^"'\s>]*["']?)|(height\s*=\s*["']?[^"'\s>]*["']?)|)[^>]*?)*>/ig;
    str = str.replace(re,"<img $1 $2 $3 $4>");
    var re = /<a(?=[\s>])[^>]*?(?:(?:(href\s*=\s*["']?[^"'\s>]*["']?)|(target\s*=\s*["']?[^"'\s>]*["']?)|)[^>]*?)*>/ig;
    str = str.replace(re,"<a $1 $2>");
      

  2.   

    其实写验证属性的表达式大概是这样的
    /<标签名(?=[\s>])[^>]*?(?:(?:******)[^>]*?)*>/ig;
    ******部分:
    (属性1\s*=\s*["']?[^"'\s>]*["']?)|(属性2\s*=\s*["']?[^"'\s>]*["']?)|(属性3\s*=\s*["']?[^"'\s>]*["']?)|用程序生成很容易.具体你自己写了
    replace的话一定要按照属性的数目来写4个属性<xxx $1 $2 $3 $4>.3个属性<xxx $1 $2 $3>.至于实际标签有几个合法属性,他就会取出几个属性.没有的属性也不会出错
      

  3.   

    感觉最好使用类似UBB标签的那种安全些
      

  4.   

    看了各位的回复之后,我也大略看了一下UBB,我的意思就是自己写类似UBB这些过滤函数,因为自己的要求(已上所举例只是要用到的一种情况)和通用的UBB有不少地方不太一样,不能直接拿来用,后来因为时间有限,加上本来实际要应用的问题取消,所以研究就放下了。
    我自己已经写了一下,是在用php在服务器端处理的,因为php里的的正则感觉好象比javascript的强大一些。
    有空再和各位就这个问题继续探讨。谢谢大家的回复。