比如:
<div style="background-color:gray;" id="footer">
  <a id="gotop" href="#" onclick="MGJS.goTop();return false;">Top</a>
  <a id="powered" href="http://wordpress.org/">WordPress</a>
  <div id="copyright">
  Copyright &copy; 2009 简单生活 —— Kevin Yang的博客
  </div>
  <div id="themeinfo">
  Theme by <a href="http://www.neoease.com/">mg12</a>. Valid <a href="http://validator.w3.org/check?uri=referer">XHTML 1.1</a>
  and <a href="http://jigsaw.w3.org/css-validator/">CSS 3</a>.
  </div>
</div>能查找到id="footer"这个完整的div

解决方案 »

  1.   

    尝试了很多种,但都不行:
    <?
    $string ="<div>d<p>p<div>div</div><div>div</div><div id='footer'>d<div>rdiv</div>iv</div><div>div</div>p</p>dd</div>";$p = "#(<(\w+)[^>]*(?:id=['\"].*?['\"])[^>]*>)((?:(?:[^<]|<(?!\\2))*?|(?R))*)(</\\2>)#ise";
    $p = "/(".   
    "<\!\w+(?:\s+[^>]*?)+\s*>|".   
    "<\w+(?:\s+\w+(?:\s*=\s*(?:\"[^\"]*\"|'[^']*'|[^\"'>\s]+))?)*\s*\/?>|".   
    "<\/\w+\s*>|".   
    "<\!--[^-]*-->".   
    ")/"; $p = "#<(?P<HtmlTag>div)[^>]*\s[iI][dD]=(?P<Quote>[\"']?)footer(?P=Quote)[^>]*>#";
    $p = "#(<(\w+)[^>]*id=['\"].*?['\"][^>]*>)((<\\2[^>]*>(?:(?:[^<]|<(?!\\2))*?|(?R))*</\\2>)*)(</\\2>)#ise";
    $p = "#(<(\w+)[^>]*(?:id=['\"].*?['\"])[^>]*>)((?:(?:[^<]|<(?!\\2))*?|(?R))*)(</\\2>)|(<(\w+)[^>]*>)((?:(?:[^<]|<(?!\\2))*?|(?R))*)(</\\2>)#ise";$content = preg_match_all( $p, $string, $arr );print_r( $arr ); exit;
    ?>
      

  2.   

    还有种.Net的:
    C# code        string str = "<div style=\"background-color:gray;\" id=\"footer\">"
          + "<a id=\"gotop\" href=\"#\" onclick=\"MGJS.goTop();return false;\">Top</a>"
          + "<a id=\"powered\" href=\"http://wordpress.org/\">WordPress</a>"
          + "<div id=\"copyright\">"
          + "Copyright &copy; 2009 简单生活 —— Kevin Yang的博客"
          + "</div>"
          + "<div id=\"themeinfo\">"
          + "Theme by <a href=\"http://www.neoease.com/\">mg12</a>. Valid <a href=\"http://validator.w3.org/check?uri=referer\">XHTML 1.1</a>"
          + "and <a href=\"http://jigsaw.w3.org/css-validator/\">CSS 3</a>"
          + "</div>"
          + "</div><div>zzz</div>";
            Regex reg = new Regex(@"(?is)<div[^>]*?id=""footer""[^>]*?>((?!</?div).)*(((?<Open><div[^>]*>)((?!</?div).)*)*((?<-Open></div>)((?!</?div).)*)*)*(?(Open)(?!))");
            foreach (Match m in reg.Matches(str))
            {
                Response.Write(m.Value);
            }
      

  3.   

    用dom多好啊!php手册上的dom
      

  4.   

    DOM对系统有要求吗?
    比如:操作系统、是否需要额外安装其它插件?
      

  5.   

    需要libxml,对操作系统没要求,
    如果你用的是虚拟空间,基本都有安装的,用phpinfo查看一下有没有dom就行
      

  6.   

    另外,还奇怪的一个问题:
    $re = "/<(\/?)(\w+)([^>]*?)(id=['\"](\w+)['\"])*([^>]*?)>/im"对于:
    <div style="background-color:gray;" id="footer">没办法匹配id的属性,全跑到最后的([^>]*?)这个捕获组去了。
      

  7.   

    (id=['\"](\w+)['\"])+ 用+ 不用*
      

  8.   


    /<(\/?)(\w+)(([^>]*?)id=['\"](\w+)['\"])*([^>]*?)>/改成这样,将([^>]*?)(id=['\"](\w+)['\"]) 和并为一组
      

  9.   

    这个问题用正则是不好解决的,在有嵌套的情况下结束条件会冲突,建议你用dom吧,把格式补全了,用dom解析下,直接getElementById就ok了
      

  10.   

    不明白你是怎么测试的
    <?php$html = <<<STR<div style="background-color:gray;" id="footer">
      <a id="gotop" href="#" onclick="MGJS.goTop();return false;">Top</a>
      <a id="powered" href="http://wordpress.org/">WordPress</a>
      <div id="copyright">
      Copyright &copy; 2009 简单生活 —— Kevin Yang的博客
      </div>
      <div id="themeinfo">
      Theme by <a href="http://www.neoease.com/">mg12</a>. Valid <a href="http://validator.w3.org/check?uri=referer">XHTML 1.1</a>
      and <a href="http://jigsaw.w3.org/css-validator/">CSS 3</a>.
      </div>
    </div>STR;$reg = "/<(\/?)(\w+)(([^>]*?)id=['\"](\w+)['\"])*([^>]*?)>/im";preg_match($reg, $html, $matches);var_dump($matches);// 显示结果array(7) {
      [0]=>
      string(48) "<div style="background-color:gray;" id="footer">"
      [1]=>
      string(0) ""
      [2]=>
      string(3) "div"
      [3]=>
      string(43) " style="background-color:gray;" id="footer""
      [4]=>
      string(32) " style="background-color:gray;" "
      [5]=>
      string(6) "footer"
      [6]=>
      string(0) ""
    }