本帖最后由 regex2013 于 2011-03-15 16:34:15 编辑

解决方案 »

  1.   

        不好意思,楼主没能完成,却感觉有点难,我只分析到这一步能把中间的规则的标签一个挨一个的变成[a]xxx[/a],但是如果内部多层嵌套的,或者距离比较远的,顶部和底部的就无法起作用了!我实在有点糊涂了!我先把我写的代码发出来,看谁能继续研究研究!谢了!
        
         <html>
    <title>test</title>
    <head>
    <script type="text/javascript">
    window.onload=function(){
    //alert(document.getElementsByTagName('body')[0].getElementsByTagName('p')[0].innerHTML);
    var tt=document.getElementsByTagName('body')[0].getElementsByTagName('p')[0].innerHTML;
    var reg=/<([^>]+)>(.*?)<(\/[^>]+)>/igm;
    var str=tt.replace(reg,'[$1]$2[$3]');
     alert(str);
    }
    </script>
    </head>
    <body>
    <P style="background-color:aqua;padding:30px;">
    <TABLE>
      <TBODY>
      <TR>
        <TD>
          <P id="img1" onclick="alert(this.parentElement.id)"><A href="http://image.img.com///2011/03/141740919.jpg" target=_blank><IMG class=imgborder border=1 alt=2011XUFULTZ  src="templetfile/232958916.jpg" width=270 height=180></A></P>
          <P id="img1text" style="TEXT-ALIGN: center"><SPAN style="COLOR: #0000ff"><B>2011XUFULTZ</B></SPAN></P></TD>
        <TD>
          <P id="img2"><A href="http://image.img.com///2011/03/141804409.jpg" target=_blank><IMG class=imgborder border=1 alt=2012FT  src="templetfile/233028672.jpg" width=270  height=180></A></P>
          <P id="img2text" style="TEXT-ALIGN: center"><SPAN  style="COLOR: #0000ff"><B>2012</B></SPAN></P>
          </TD>
      </TR>
      </TBODY>
    </TABLE>
    </P>
    <P>
    <TABLE class=table_news border=0 cellSpacing=0 cellPadding=0 align=center>
      <THEAD>
      <TR>
        <TH>ch</TH>
        <TH>2011LTZ</TH>
        <TH>2012itanium</TH></TR></THEAD>
      <TBODY>
      <TR>
        <TD colSpan=3>外观尺寸及容量</TD></TR>
      <TR>
        <TD>长mm</TD>
        <TD>4597</TD>
        <TD>4534</TD></TR>
      <TR>
        <TD>宽mm</TD>
        <TD>1796</TD>
        <TD>1824</TD></TR>
      <TR>
        <TD>高mm</TD>
        <TD>1476</TD>
        <TD>1468</TD></TR>
      </TBODY>
    </TABLE>
    </P>
    </body>
    </html>
        
      

  2.   

    感谢falizixun2,也请各位朋友继续关注!
      

  3.   

    <html>
    <title>test</title>
    <head>
    <script type="text/javascript">
    window.onload=function(){
    //alert(document.getElementsByTagName('body')[0].getElementsByTagName('p')[0].innerHTML);
    var tt = window.tt = document.getElementsByTagName('body')[0];

    var content = tt.innerHTML;

    var table = '', table_replace = '', tables = null;
    var index = 0, prefix = '', after = '';

    // 第一次找出所有p标签中的table
    var reg1 = /\s*<p[^>]*>\s*(<table[^>]*>(?:\s*<(?!\/?table[^>]*>)[^>]+>[^<]*)+<\/table>)\s*<\/p>\s*/igm;

    // 第二次将<>变成[]
    var reg2 = /<([^>]+)>/igm;

    while ((tables = reg1.exec(content)) != null)  {
    table = tables[1];
    table_replace = table.replace(reg2, '[$1]');


    // 查找字符串的位置, 将正确的内容替换回去
    index = content.indexOf(table);
    prefix = content.substring(0, index);
    afterfix = content.substring(index + table.length);
    content = prefix + table_replace + afterfix;
    }
    tt. innerHTML = content;
    }
    </script>
    </head>
    <body>
    <P style="background-color:aqua;padding:30px;">
    <TABLE>
      <TBODY>
      <TR>
        <TD>
          <P id="img1" onclick="alert(this.parentElement.id)"><A href="http://image.img.com///2011/03/141740919.jpg" target=_blank><IMG class=imgborder border=1 alt=2011XUFULTZ  src="templetfile/232958916.jpg" width=270 height=180></A></P>
          <P id="img1text" style="TEXT-ALIGN: center"><SPAN style="COLOR: #0000ff"><B>2011XUFULTZ</B></SPAN></P></TD>
        <TD>
          <P id="img2"><A href="http://image.img.com///2011/03/141804409.jpg" target=_blank><IMG class=imgborder border=1 alt=2012FT  src="templetfile/233028672.jpg" width=270  height=180></A></P>
          <P id="img2text" style="TEXT-ALIGN: center"><SPAN  style="COLOR: #0000ff"><B>2012</B></SPAN></P>
          </TD>
      </TR>
      </TBODY>
    </TABLE>
    </P>
    <P>
    <TABLE class=table_news border=0 cellSpacing=0 cellPadding=0 align=center>
      <THEAD>
      <TR>
        <TH>ch</TH>
        <TH>2011LTZ</TH>
        <TH>2012itanium</TH></TR></THEAD>
      <TBODY>
      <TR>
        <TD colSpan=3>外观尺寸及容量</TD></TR>
      <TR>
        <TD>长mm</TD>
        <TD>4597</TD>
        <TD>4534</TD></TR>
      <TR>
        <TD>宽mm</TD>
        <TD>1796</TD>
        <TD>1824</TD></TR>
      <TR>
        <TD>高mm</TD>
        <TD>1476</TD>
        <TD>1468</TD></TR>
      </TBODY>
    </TABLE>
    </P>
    </body>
    </html>
      

  4.   


    \n 换 <br/> ....
      

  5.   

     ++++++
     真的很强悍!
     楼主这个帖我不要分了,全给hnxxwyq吧!
      

  6.   

    str.replace(/<(?!\/?p\b)([^>]+)>/gi, "[$1]")CODE:<textarea id="txt">
    <P style="background-color:aqua;padding:30px;">
    <TABLE>
      <TBODY>
      <TR>
        <TD>
          <P id="img1" onclick="alert(this.parentElement.id)"><A href="http://image.img.com///2011/03/141740919.jpg" target=_blank><IMG class=imgborder border=1 alt=2011XUFULTZ  src="templetfile/232958916.jpg" width=270 height=180></A></P>
          <P id="img1text" style="TEXT-ALIGN: center"><SPAN style="COLOR: #0000ff"><B>2011XUFULTZ</B></SPAN></P></TD>
        <TD>
          <P id="img2"><A href="http://image.img.com///2011/03/141804409.jpg" target=_blank><IMG class=imgborder border=1 alt=2012FT  src="templetfile/233028672.jpg" width=270  height=180></A></P>
          <P id="img2text" style="TEXT-ALIGN: center"><SPAN  style="COLOR: #0000ff"><B>2012</B></SPAN></P>
          </TD>
      </TR>
      </TBODY>
    </TABLE>
    </P>
    <P>
    <TABLE class=table_news border=0 cellSpacing=0 cellPadding=0 align=center>
      <THEAD>
      <TR>
        <TH>ch</TH>
        <TH>2011LTZ</TH>
        <TH>2012itanium</TH></TR></THEAD>
      <TBODY>
      <TR>
        <TD colSpan=3>外观尺寸及容量</TD></TR>
      <TR>
        <TD>长mm</TD>
        <TD>4597</TD>
        <TD>4534</TD></TR>
      <TR>
        <TD>宽mm</TD>
        <TD>1796</TD>
        <TD>1824</TD></TR>
      <TR>
        <TD>高mm</TD>
        <TD>1476</TD>
        <TD>1468</TD></TR>
      </TBODY>
    </TABLE>
    </P>
    </textarea><script>
    alert(txt.value.replace(/<(?!\/?p\b)([^>]+)>/gi, "[$1]"))
    </script> 
      

  7.   

    你这个是什么意思<(?!\/?p\b)([^>]+)>  ?这个没看太懂,能详解一下吗?还有既然是多行,为什么你在正则末尾不加/igm,不加m呢?特请教,谢谢!
      

  8.   

    学习了:<html>
    <head>
    <title></title>
    <meta http-equiv="Content-Type" content="text/html;charset=GBK">
    </head>
    <body>
    <P>
    <TABLE class=table_news border=0 cellSpacing=0 cellPadding=0 align=center>
      <THEAD>
      <TR>
        <TH>ch</TH>
        <TH>2011LTZ</TH>
        <TH>2012itanium</TH></TR></THEAD>
      <TBODY>
      <TR>
        <TD colSpan=3>外观尺寸及容量</TD></TR>
      <TR>
        <TD>长mm</TD>
        <TD>4597</TD>
        <TD>4534</TD></TR>
      <TR>
        <TD>宽mm</TD>
        <TD>1796</TD>
        <TD>1824</TD></TR>
      <TR>
        <TD>高mm</TD>
        <TD>1476</TD>
        <TD>1468</TD></TR>
      </TBODY>
    </TABLE>
    </P>
    <script type="text/javascript">
      window.onload = function()
      {
       var pelems = document.getElementsByTagName("p");
       for(i=0;i<pelems.length;i++)
       {
          var tab = pelems[i].innerHTML;
          var reg = /<([^<]+)>/g;
          pelems[i].innerHTML = tab.replace(reg,'[$1]').replace(/\r\n/g,'<br>');
       }
        
      }
    </script>
    </body>
    </html>
      

  9.   

    你的方法应该行,但如何把
    [TABLE class=table_news border=0 cellSpacing=0 cellPadding=0 align=center] [THEAD] [TR] [TH]ch[/TH] [TH]2011LTZ[/TH] [TH]2012itanium[/TH][/TR][/THEAD] [TBODY] [TR] [TD colSpan=3]外观尺寸及容量[/TD][/TR] [TR] [TD]长mm[/TD] [TD]4597[/TD] [TD]4534[/TD][/TR] [TR] [TD]宽mm[/TD] [TD]1796[/TD] [TD]1824[/TD][/TR] [TR] [TD]高mm[/TD] [TD]1476[/TD] [TD]1468[/TD][/TR][/TBODY][/TABLE]
    再变回原样呢?
      

  10.   


    <html>
    <title>test</title>
    <head>
    <script type="text/javascript">
    朋友你的代码实现了把<p>下的table代码都[]形式,我希望该再能实现把<p>[table]...[/table]</p>包替换回来</script>
    </head>
    <body>
    <p>111111</p>
    <p>222</p>
    <P style="background-color:aqua;padding:30px;">
    <TABLE>
      <TBODY>
      <TR>
        <TD>
          <P id="img1" onclick="alert(this.parentElement.id)"><A href="http://image.img.com///2011/03/141740919.jpg" target=_blank><IMG class=imgborder border=1 alt=2011XUFULTZ  src="templetfile/232958916.jpg" width=270 height=180></A></P>
          <P id="img1text" style="TEXT-ALIGN: center"><SPAN style="COLOR: #0000ff"><B>2011XUFULTZ</B></SPAN></P></TD>
        <TD>
          <P id="img2"><A href="http://image.img.com///2011/03/141804409.jpg" target=_blank><IMG class=imgborder border=1 alt=2012FT  src="templetfile/233028672.jpg" width=270  height=180></A></P>
          <P id="img2text" style="TEXT-ALIGN: center"><SPAN  style="COLOR: #0000ff"><B>2012</B></SPAN></P>
          </TD>
      </TR>
      </TBODY>
    </TABLE>
    </P>
    <p>33333</p>
    <P>
    <TABLE class=table_news border=0 cellSpacing=0 cellPadding=0 align=center>
      <THEAD>
      <TR>
        <TH>ch</TH>
        <TH>2011LTZ</TH>
        <TH>2012itanium</TH></TR></THEAD>
      <TBODY>
      <TR>
        <TD colSpan=3>外观尺寸及容量</TD></TR>
      <TR>
        <TD>长mm</TD>
        <TD>4597</TD>
        <TD>4534</TD></TR>
      <TR>
        <TD>宽mm</TD>
        <TD>1796</TD>
        <TD>1824</TD></TR>
      <TR>
        <TD>高mm</TD>
        <TD>1476</TD>
        <TD>1468</TD></TR>
      </TBODY>
    </TABLE>
    </P>
    </body>
    </html>
      

  11.   

    <(?!\/?p\b)([^>]+)>
    我个人的理解是:字面意思为:<符号后为,不是0个或1个单词边界的p标签,之后为1个或多个不是>字符的任何符号并以>结尾意思就是匹配除了<p>或</p>以外的任何<...>,</...>这样的元素标签。不知道我的理解有没有错!欢迎指正!
      

  12.   


    如果你只是为了替换后处理过以后再替换回来,建议你直接用 [[[table]]]代替[table], 以便减小误差,这样的话你就可以直接
    <script type="text/javascript">
        var tt = document.getElementsByTagName('body')[0];
        tt.innerHTML = tt.innerHTML.replace(/\[\[\[([^\]]+)\]\]\]/igm, '<$1>');
    </script>
      

  13.   

    <textarea id="txt" style="width:600px;height:500px">
    <P style="background-color:aqua;padding:30px;">
    <TABLE>
      <TBODY>
      <TR>
        <TD>
          <P id="img1" onclick="alert(this.parentElement.id)"><A href="http://image.img.com///2011/03/141740919.jpg" target=_blank><IMG class=imgborder border=1 alt=2011XUFULTZ  src="templetfile/232958916.jpg" width=270 height=180></A></P>
          <P id="img1text" style="TEXT-ALIGN: center"><SPAN style="COLOR: #0000ff"><B>2011XUFULTZ</B></SPAN></P></TD>
        <TD>
          <P id="img2"><A href="http://image.img.com///2011/03/141804409.jpg" target=_blank><IMG class=imgborder border=1 alt=2012FT  src="templetfile/233028672.jpg" width=270  height=180></A></P>
          <P id="img2text" style="TEXT-ALIGN: center"><SPAN  style="COLOR: #0000ff"><B>2012</B></SPAN></P>
          </TD>
      </TR>
      </TBODY>
    </TABLE>
    </P>
    <P>
    <TABLE class=table_news border=0 cellSpacing=0 cellPadding=0 align=center>
      <THEAD>
      <TR>
        <TH>ch</TH>
        <TH>2011LTZ</TH>
        <TH>2012itanium</TH></TR></THEAD>
      <TBODY>
      <TR>
        <TD colSpan=3>外观尺寸及容量</TD></TR>
      <TR>
        <TD>长mm</TD>
        <TD>4597</TD>
        <TD>4534</TD></TR>
      <TR>
        <TD>宽mm</TD>
        <TD>1796</TD>
        <TD>1824</TD></TR>
      <TR>
        <TD>高mm</TD>
        <TD>1476</TD>
        <TD>1468</TD></TR>
      </TBODY>
    </TABLE>
    </P>
    </textarea>
    <br>
    <input type=button value=替 换 onclick="javascript:txt.value=txt.value.replace(/<(?!\/?p\b)([^>]+)>/gi, '[$1]')">
    <input type=button value=替 换 onclick="javascript:txt.value=txt.value.replace(/\[([^\]]+)\]/gi, '<$1>')">
      

  14.   

    纠正:上面<input type=button value=替 换 onclick="javascript:txt.value=txt.value.replace(/\[([^\]]+)\]/gi, '<$1>')">的“替换”应为“复原”,笔误。
      

  15.   

    12楼的貌似最合适了。咱写了个返回的函数,你就将就的用吧。不要给分
    <html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html;charset=GBK">
    </head>
    <body>
    <P>
        <TABLE class=table_news border=0 cellSpacing=0 cellPadding=0 align=center>
      <THEAD>
      <TR>
        <TH>ch</TH>
        <TH>2011LTZ</TH>
        <TH>2012itanium</TH></TR></THEAD>
      <TBODY>
      <TR>
        <TD colSpan=3>外观尺寸及容量</TD></TR>
      <TR>
        <TD>长mm</TD>
        <TD>4597</TD>
        <TD>4534</TD></TR>
      <TR>
        <TD>宽mm</TD>
        <TD>1796</TD>
        <TD>1824</TD></TR>
      <TR>
        <TD>高mm</TD>
        <TD>1476</TD>
        <TD>1468</TD></TR>
      </TBODY>
    </TABLE>
    </P>
    <script type="text/javascript">
      function re_table()
      {
          var pelems = document.getElementsByTagName("p");
          for(i=0;i<pelems.length;i++)
          {
                var tab = pelems[i].innerHTML;
                var reg = /<([^<]+)>/g;
                pelems[i].innerHTML = tab.replace(reg,'[$1]').replace(/\r\n/g,'<br>');
          }
           
      }
      function back_table()
        {
          var pelems = document.getElementsByTagName("p");
          for(i=0;i<pelems.length;i++)
          {
      alert(pelems[i].innerHTML);
                var tab = pelems[i].innerHTML;
                var reg = /\[([^\[]+)\]/g;
                pelems[i].innerHTML = tab.replace(reg,'<$1>').replace('<br>',/\r\n/g);
          }
           
      }
      re_table();
      back_table();
    </script>
    </body>
    </html>
      

  16.   


        适合是适合,但是第一次替换<([^<]+)>为[],第二次替换换行的思路和正则代码,全部源自hnxxwyq,可以说这个正则的原创者依然是hnxxwyq!其他几个代码都是依样画葫芦,拿去改改而已,正则思路并没有突破原格局!所以我尊重原创者#6hnxxwyq!呵呵!
       
      

  17.   

        还有10#的<(?!\/?p\b)([^>]+)>这个正则也具有一定创新性,不是简单拿别人的正则直接用,格局有所改变,也值得学习一下!
      

  18.   

    如果需要很精确的替换——<textarea id="txt" style="width:600px;height:500px">
    <P style="background-color:aqua;padding:30px;">
    <TABLE>
      <TBODY>
      <TR>
        <TD>
          <P id="img1" onclick="alert(this.parentElement.id)"><A href="http://image.img.com///2011/03/141740919.jpg" target=_blank><IMG class=imgborder border=1 alt=2011XUFULTZ  src="templetfile/232958916.jpg" width=270 height=180></A></P>
          <P id="img1text" style="TEXT-ALIGN: center"><SPAN style="COLOR: #0000ff"><B>2011XUFULTZ</B></SPAN></P></TD>
        <TD>
          <P id="img2"><A href="http://image.img.com///2011/03/141804409.jpg" target=_blank><IMG class=imgborder border=1 alt=2012FT  src="templetfile/233028672.jpg" width=270  height=180></A></P>
          <P id="img2text" style="TEXT-ALIGN: center"><SPAN  style="COLOR: #0000ff"><B>2012</B></SPAN></P>
          </TD>
      </TR>
      </TBODY>
    </TABLE>
    </P>
    <P>
    <TABLE class=table_news border=0 cellSpacing=0 cellPadding=0 align=center>
      <THEAD>
      <TR>
        <TH>ch</TH>
        <TH>2011LTZ</TH>
        <TH>2012itanium</TH></TR></THEAD>
      <TBODY>
      <TR>
        <TD colSpan=3>外观尺寸及容量</TD></TR>
      <TR>
        <TD>长mm</TD>
        <TD>4597</TD>
        <TD>4534</TD></TR>
      <TR>
        <TD>宽mm</TD>
        <TD>1796</TD>
        <TD>1824</TD></TR>
      <TR>
        <TD>高mm</TD>
        <TD>1476</TD>
        <TD>1468</TD></TR>
      </TBODY>
    </TABLE>
    </P>
    </textarea>
    <br>
    <input type=button value=替 换 onclick="javascript:txt.value=txt.value.replace(/<table[\S\s]*?\/table>/gi, function($){return $.replace(/<([^>]+)>/g, '[$1]')})">
    <input type=button value=复 原 onclick="javascript:txt.value=txt.value.replace(/\[([^\]]+)\]/gi, '<$1>')">
      

  19.   


    楼上的这些如果,<p>外边有<table>的话,基本上外边的<table>也会替换的,当然如果没有<p>标签外存在的话,这个是不需要这么严谨的第二种如果有一个"[一]"这样的内容的话,也是会替换掉的所以没有那个正则一定是正确的答案,要根据自己的实际应用来衡量,简单就要楼上的,严谨就用我给你说的
      

  20.   

    这样的问题我想大家都在绕弯子吧
    本身就是不符合DTD的东西,为什么非要去做呢
    现在仅仅是为了一个select折腾个来回有必要吗?
    不说楼上诸位的正则缺陷,即使是正确的,对代码的可维护性有好处么