要这样的:/^<(.*?)>.*?<\/\1>$/还是这样的:/<(.*?)>.*?<\/\1>/g

解决方案 »

  1.   

    你再不揭贴,这是我回复你的最后一贴!
        安你的意思,标签<不允许有空格(html允许有空格),再考虑到html标签<后的第一个字符应该是字母,故用[a-z];还要考虑到标签并不都是象<html>、</html>,还有象<form name="theForm"...>....</form>;还应考虑到换行,但这里假定标签名字这个单词本身不换行,如from不存在换行,(注:事实上标签名换行是允许的,象:<h换行tml>...<\换行html换行>,也是合法的html);i忽略大小写。
        oPattern = /<([a-z][^\s]*)(.|\n)*?<\/\1>/i;
        上面的式子并不通用,标签名字换行,以后分解,但不是在这个帖子下,今天就到这。
      

  2.   

    冤,早就结了,只是显示有问题,是csdn的错!您得了65分,不信你看“我得分的帖子”,我的结贴率可是100.000%。
      

  3.   

    海龙王:先给你找出一个问题:
    /<([a-z][^\s]*)(.|\n)*?<\/\1>/i它能匹配<htmlabc></html>,这不是期待的结果
      

  4.   

    <script>
    alert(/<([a-z]+)>.*<\/\1>/i.test("<htmlabc></html>"))
    alert(/<(\w+?)>.+?<\/\1>/.test("<htmlabc></html>"))
    </script>
      

  5.   

    This maybe ok<script>
    alert(/<([a-z]+)( .*)?>.*<\/\1>/i.test("<htmlabc></html>"))
    </script>
      

  6.   

    cnlyl(海龙王) :我上一个帖子迟迟不结是因为一直在考虑有没有更好的解决方式 :) ,而这阵子偏偏又太忙没有时间研究。现在已经结了: http://expert.csdn.net/Expert/topic/1818/1818151.xml
      

  7.   

    非常遗憾,楼主的目的是不能达成的。
    因为HTML的标签可以有嵌套、缺省等等情况。常规表达式在定位到首标签后无法确定应该做最大匹配还是最小匹配,因此无法正确定位到尾标签。
    比如说下面这个嵌套表格:
    <table>
     <tr>
      <td>
       <table>
        <tr>
         <td>内容</td>
        </tr>
       </table>
      </td>
     </tr>
    </table>
    如果要匹配<table></table>标签,用最大匹配只能匹配外层,用最小匹配则定位错误。
    因此严格匹配对于HTML来说是无法实现的。
    其实楼主去参考一些论坛的BBCode,如VBB,YBB等的转译程序就会明白,那些BBCode的转译程序的常规表达式都是只针对等单个标签解释,没有一个是严格匹配的,否则必定错误百出。
      

  8.   

    0153(户愚吕弟) 说的有一定道理,若不借助其他逻辑仅用正则表达式是不能完成的。html语法有些混乱,他允许不封闭的标签存在。
      

  9.   

    收到怪我问题没有说清楚,虽然我说了只讨论<html></html>这种标签,不讨论<br>这种标签,但没有说明要不要考虑嵌套、属性等问题,如果谁写出了考虑了嵌套、属性的正则,希望不要吝啬,拿出来让大家参考参考现在测试各位朋友的不考虑嵌套、属性的正则:
    emu(ston) :
    <(.*?)>.*?<\/\1>
    能匹配< ></ >其中空格是制表符,不对,(csdn检查回复不能为空的时候也忽略了制表符)bencalie(Bencalie):
    /<([a-z]+)>.*<\/\1>/i
    好像没有问题,可是我不太懂,后面的\1是什么意思?<([a-z]+)( .*)?>.*<\/\1>
    这个是考虑了属性和嵌套,是么?它虽然
    能匹配<font size="10"><b>女人</b></font>
    但是它也能匹配<font size="10" <b></b>><b>女人</b></font>
    应该也是有问题吧
      

  10.   

    \1表示对所获取的匹配的引用,这里是表达式中的第一个括号内表达式([a-z]+)匹配的部分<([a-z]+)( .*)?>.*<\/\1>的确如你所说,那么就改成<([a-z]+)( [^<>/]*)?>.*<\/\1>,让属性中不允许出现>、<和/,你要排除的都可以加到方括号里
      

  11.   

    -------------------------------------------------
    emu(ston) :
    <(.*?)>.*?<\/\1>
    能匹配< ></ >其中空格是制表符,不对,(csdn检查回复不能为空的时候也忽略了制表符)
    -------------------------------------------------/<(\S*?)(\s.*?)?>.*?<\/\1>/g如何?不过这样做<></>可以通过。
      

  12.   

    嗯,试验一下:var r = /<(\S*?)(\s.*?)?>.*?<\/\1>/
    alert(r.test("<aa>test</aa>"));
    alert(r.test("<aa emu=ston disabled>test again</aa>"));
    alert(r.test("<ab>test</aa>"));
      

  13.   

    仅仅是讨论一下。/<(\w+)(.*?)?>(.*?)<\/\1>/ig 并不能匹配多少东西。html部分是google的首业内容<html><head><meta http-equiv="content-type" content="text/html; charset=UTF-8"><title>Google</title><style><!--
    body,td,a,p,.h{font-family:arial,sans-serif;}
    .h{font-size: 20px;}
    .q{text-decoration:none; color:#0000cc;}
    //-->
    </style>
    <script>
    <!--
    function sf(){document.f.q.focus();}
    function c(p,l,e){var f=document.f;if (f.action && document.getElementById) {var hf=document.getElementById("hf");if (hf) {var t = "<input type=hidden name=tab value="+l+">";hf.innerHTML=t;}f.action = 'http://'+p;e.cancelBubble=true;f.submit();return false;}return true;}
    // -->
    </script>
    </head><body bgcolor=#ffffff text=#000000 link=#0000cc vlink=#551a8b alink=#ff0000 onLoad=sf()><center><table border=0 cellspacing=0 cellpadding=0><tr><td><img src="/intl/zh-CN_ALL/images/logo.gif" width=286 height=110 alt="Google"></td></tr></table><br><table border=0 cellspacing=0 cellpadding=0><tr><td width=15>&nbsp;</td><td id=0 bgcolor=#3366cc align=center width=120 nowrap><font color=#ffffff size=-1><b>鎵€鏈夌綉绔?/b></font></td><td width=15>&nbsp;</td><td id=1 bgcolor=#efefef align=center width=120 nowrap onClick="return c('www.google.com/imghp','wi',event);" style=cursor:pointer;cursor:hand;><a id=1a class=q href="/imghp?hl=zh-CN&tab=wi&ie=UTF-8&oe=UTF-8" onClick="return c('www.google.com/imghp','wi',event);"><font size=-1>鍥惧儚</font></a></td><td width=15>&nbsp;</td><td id=2 bgcolor=#efefef align=center width=120 nowrap onClick="return c('www.google.com/grphp','wg',event);" style=cursor:pointer;cursor:hand;><a id=2a class=q href="/grphp?hl=zh-CN&tab=wg&ie=UTF-8&oe=UTF-8" onClick="return c('www.google.com/grphp','wg',event);"><font size=-1>缃戜笂璁哄潧</font></a></td><td width=15>&nbsp;</td><td id=3 bgcolor=#efefef align=center width=120 nowrap onClick="return c('www.google.com/dirhp','wd',event);" style=cursor:pointer;cursor:hand;><a id=3a class=q href="/dirhp?hl=zh-CN&tab=wd&ie=UTF-8&oe=UTF-8" onClick="return c('www.google.com/dirhp','wd',event);"><font size=-1>缃戦〉鐩綍</font></a></td><td width=15>&nbsp;</td></tr><tr><td colspan=10 bgcolor=#3366cc><img width=1 height=1 alt=""></td></tr></table><br><form action="/search" name=f><span id=hf></span><table cellspacing=0 cellpadding=0><tr valign=middle><td width=75>&nbsp;</td><td align=center><input maxLength=256 size=55 name=q value="">
    <script>
    document.f.q.focus();
    </script>
    <input type=hidden name=ie value="UTF-8"><input type=hidden name=oe value="UTF-8"><input name=hl type=hidden value=zh-CN><br><input type=submit value="Google鎼滅储" name=btnG><input type=submit value="鎵嬫皵涓嶉敊" name=btnI></td><td valign=top nowrap><font size=-1>&nbsp;&#8226;&nbsp;<a href=/advanced_search?hl=zh-CN>楂樼骇鎼滅储</a><br>&nbsp;&#8226;&nbsp;<a href=/preferences?hl=zh-CN>浣跨敤鍋忓ソ</a><br>&nbsp;&#8226;&nbsp;<a href=/language_tools?hl=zh-CN>璇█宸ュ叿</a></font></td></tr><tr><td colspan=3 align=center><font size=-1><input type=radio name=lr value="" checked>鎼滅储鎵€鏈夌綉绔?input type=radio name=lr value=lang_zh-CN|lang_zh-TW >鎼滅储鎵€鏈変腑鏂囩綉椤?input type=radio name=lr value=lang_zh-CN >鎼滅储绠€浣撲腑鏂囩綉椤?/font></td></tr></table></form><p><font size=-1><p></font><br><br><font size=-1><a href=/intl/zh-CN/about.html>Google 澶у叏</a> - <b><a href=http://www.google.com/ncr>Google.com in English</a></b><span id=hp style="behavior:url(#default#homepage)"></span>
    <script>
    //<!--
    if (!hp.isHomePage('http://www.google.com/')) {document.write("<p><a href=\"/mgyhp.html\" onClick=\"style.behavior='url(#default#homepage)';setHomePage('http://www.google.com/');\">灏?Google 璁句负棣栭〉锛?/a>");}
    //-->
    </script></font><p><font size=-1>&copy;2003 Google - 鎼滅储 3,083,324,652 寮犵綉椤?/font></p></center></body></html><script>
    re = /<(\w+)(.*?)?>(.*?)<\/\1>/ig;
    ar = document.body.innerHTML.match(re);
    for(i=0;i<ar.length;i++)
    document.write(i+":: "+ar[i].replace(/</,"&lt;")+"<br>")
    </script>
      

  14.   

    还是有问题,看来xuzuning(唠叨) 的例子让人泄气——解决嵌套的问题好像没有希望了,理由就是0153(户愚吕弟) 所说的那样。现在抛开嵌套,仅考虑属性,下面两位的写法还是有欠缺
    emu(ston):
    <([a-z]+)( [^<>/]*)?>.*<\/\1>
    能匹配不合法<font size="7>">ddddd</font>等emu(ston):
    /<(\S*?)(\s.*?)?>.*?<\/\1>/g
    除了你已经意识到的<></>外,它还能匹配不合法的<font <br>>女人</font>等:(真的佷郁闷
      

  15.   

    <font <br>>女人</font>不是很合法吗?
      

  16.   

    嗯,确实不合法。要这样才合法:<font &lt;br>&gt;女人</font>或者按照我们原来期望的:<font &lt;br&gt;>女人</font>
      

  17.   

    没有什么啦,我只是刚学正则,没事自己找了几个题目来做,发现自己水平有限,于是上来象各位讨教。没有明确的目的,也没有希望用它来干什么,倘若一定要给本贴定一个目标,那就是要写出一个尽可能正确地匹配HTML标记的正则表达式
      

  18.   

    正则表达式的基础是“形式语言”,而xml较为接近形式语言,html更接近自然语言一点。
    永远都不要试图把“世界”放在某个规则里去。如果可能的话,你我也就没有在这里发议论的可能了。楼主的要求不是不能解决的,只是说不能企图用一个简单的式子来解决,而是把复杂的问题简单化。
    比如,若将html从允许的不封闭标签处分割,则每个片段还是有可能用正则匹配的。
      

  19.   

    有脑筋干嘛不动,不怕生锈?要不,新开一帖,题目就是:用正则正确找出html(xml)文档的所有标记,如:
    <table align="center"><tr><td><table><tr><td>内容1</td></tr></table></td></tr></table>
    要求列出下列结果:
    <table align="center"><tr><td><table><tr><td>内容1</td><td>内容2</td></tr></table></td></tr></table>
    <tr><td><table><tr><td>内容1</td><td>内容2</td></tr></table></td></tr>
    <td><table><tr><td>内容</td><td>内容2</td></tr></table></td>
    <table><tr><td>内容</td><td>内容2</td></tr></table>
    <tr><td>内容</td><td>内容2</td></tr>
    <td>内容1</td><td>内容2</td>
    <td>内容1</td>
    <td>内容2</td>
      

  20.   

    sorry,上例中结果应该没有:<td>内容1</td><td>内容2</td>
      

  21.   

    嵌套的情形很难处理除非用xmldom,我自己写js处理的时候都是禁止同一个标记嵌套自己的。
      

  22.   

    只是一个不严谨的例子,参考一下:<BODY>
    <textarea id=t cols=100 rows=20></textarea>
    <SCRIPT LANGUAGE="JavaScript">
    <!--
    var st = "<table align=\"center\"><tbody><tr><td>test1</td><td>test2</td></tr><tr><td>test3</td></tr></tbody></table>";
    var r = /<(\w+)(\s.*?)?>.*?<\/\1>/g
    var result = new Object;
    for (var i=0;i<st.length;i++){
    s = st.substr(i).match(r);
    if (s) for (var j=0;j<s.length;j++) result[s[j]]=s[j];
    }
    for (var i in result)
    t.value += i+"\n"
    //-->
    </SCRIPT>
    </BODY>