我现在有一段HTML源码, 我要将其中的空白段落<p>(也可能为<p style="..." class="...">这种形式), 如果<p>标签中只包含 <br>、&nbsp;、空字符串(包括圆角空格)和空白段落,则将这个空白段落给删除, 请问这个正则表达式怎么写?
我现在写了一个这样的:var re = new RegExp("(<p>|<p\\s.*?>)(\\s| |&nbsp;|<br\\s*/?>)*</p>","ig");
htmlValue = htmlValue.replace(/\n/g,"").replace(/<p\/>|<p\s.*?\/>/ig,"").replace(re,"");这个正则表达式只能去掉没有嵌套其他空白段落的空白段落, 如<p>  <br>&nbsp; <br></p>, 
如果有一个这样的空白段落:
<p id="p1"><br> <p id="p2">  <br> &nbsp; </p> &nbsp;</p>
对于这样的只会去年最里层的空白段落, 在此即为 p2, 我希望能直接将 p1去年, 这个正则式怎么写啊?

解决方案 »

  1.   

    需要循环处理,可以这样(未测试):var re = new RegExp("(<p>|<p\\s.*?>)(\\s| |&nbsp;|<br\\s*/?>)*</p>","ig");
    while(re.test(htmlValue)){
        htmlValue = htmlValue.replace(/\n/g,"").replace(/<p\/>|<p\s.*?\/>/ig,"").replace(re,"");
    }
      

  2.   

    lz的正则是有问题的,嵌套时
    <p id="p1"> <br> <p id="p2">  <br> &nbsp; </p> &nbsp; </p>
    红色部分匹配了
    <script>
    var htmlValue = '<p id="p1"> <br> <p id="p2">  <br> &nbsp; </p> &nbsp; </p>';
    htmlValue = htmlValue.replace(/\n/g,"").replace(/<p\/>|<p\s.*?\/>/ig,"");
    while(true){
    var re = new RegExp("(<p>|<p\\b[^>]*>)( | |&nbsp;|<br\\b[^>]*>)*</p>","ig");
    if(re.test(htmlValue))
    htmlValue = htmlValue.replace(re,"");
    else 
    break;
    }
    alert(htmlValue);
    </script>