如下HTML代码
<div class="bd class">
<div class="ul class">
<ul>
<li>文字</li>
<li>文字</li>
<li>文字</li>
<li>文字</li>
<li>文字</li>
<li>文字</li>
<li>文字</li>
</ul>
</div>
<div class="ul1 class">
<ul>
<li>文字</li>
<li>文字</li>
<li>文字</li>
<li>文字</li>
<li>文字</li>
<li>文字</li>
<li>文字</li>
</ul>
</div>
</div>
如何匹配到所有文字,因为div有多个,如何才能正确的匹配到最后一个
谢谢

解决方案 »

  1.   

    这个,我看你都问了好几个正则问题了,是时候自己练练了
    不过你要送分我也不介意,呵呵preg_match_all("/<li>(.*)</li>/isU", $html, $array);
    print_r($array);看结果就知道如果你所说的“最后一个”指的是div,那就有点难度,需要先分割再正则,或者DOM-XPath类
      

  2.   


    我要的不是这种效果,我需要的是:<div class="bd class">.*</div>里面的内容,因为有多个DIV,他到第一个DIV就匹配成功了,我现在需要让他直接匹配到最后一个。
      

  3.   

    关键是贪婪模式$s =<<<eof
    <div class="bd class">
    <div class="ul class">
    <ul>
    <li>文字</li>
    <li>文字</li>
    <li>文字</li>
    <li>文字</li>
    <li>文字</li>
    <li>文字</li>
    <li>文字</li>
    </ul>
    </div>
    <div class="ul1 class">
    <ul>
    <li>文字</li>
    <li>文字</li>
    <li>文字</li>
    <li>文字</li>
    <li>文字</li>
    <li>文字</li>
    <li>文字</li>
    </ul>
    </div>
    </div>
    eof;
    if(preg_match('/<div\s+class="bd\s+class">(.*)<\/div>/is',$s,$arr)){
      print_r($arr);
    }
      

  4.   

    是后面加了一个s的缘故吗?我正则不是太了解,
    另外PHP正则里面有子匹配吗?
    最后你能否告诉我一下你的QQ,我想拜你为师
      

  5.   


    楼上的这个,如果<div></div>外面还有内容的话,这个是没有办法匹配的
      

  6.   

    <?php
    $s =<<<eof
    <div>我不能匹配</div>
    <div class="bd class">
    <div class="ul class">
    <ul>
    <li>文字</li>
    <li>文字</li>
    <li>文字</li>
    <li>文字</li>
    <li>文字</li>
    <li>文字</li>
    <li>文字</li>
    </ul>
    </div>
    <div class="ul1 class">
    <ul>
    <li>文字</li>
    <li>文字</li>
    <li>文字</li>
    <li>文字</li>
    <li>文字</li>
    <li>文字</li>
    <li>文字</li>
    </ul>
    </div>
    </div>
    <div>我不能匹配</div>
    eof;
    if(preg_match('#<div\s+class="bd\s+class">((?:\s*<div[^>]*>(?>\s*<(?!/?div[^>]*>)[^>]+>[^<]*)+</div>\s*)+)</div>#is',$s,$arr)){
      print_r($arr);
    }?>
    关于这个正则的讲解// 块的开始定义
    <div\s+class="bd\s+class"> // 内容匹配开始
    (

    // 多个不匹配内容开始(子div块)
    (?>

    起始可能存在的空白字符
    \s*

    // 子div块开始
    <div[^>]*>

    // 多个内容开始(格式为:"非div|/div的标签+后续内容",这个格式需要考虑内容先出现还是标签先出现)
    (?>

    // 可能存在的空白字符
    \s*

    // 标签开头
    <
    // 和上面的<构成环视,“<“后面不能是”div>“|”/div>“
    (?!/?div[^>]*>)

    // 任意标签
    [^>]+

    // 标签结尾
    >

    // 非下一个标签的内容
    [^<]*

    // 多个内容结束
    )+

    // 子div块结束
    </div>

    结尾可能存在的空白字符
    \s*

    // 多个不匹配内容结束
    )+

    // 内容匹配结束
    )// 块的结尾定义
    </div>
      

  7.   

    html文本可以用来做正则练习,不过工作中碰到html解析,特别是复杂点的,首先要考虑的是dom+xpath,其次才是正则,好刀要用在刀刃上呀,特别是php正则不支持平衡组,递归能力偏弱,而html多少层嵌套那是你拿不准的。
      

  8.   

    老虎说的就对了,别一棵树上吊死例如处理日期变更老想着日期函数,又慢又难,换成整数加减乘除然后再格式化输出简单得多如果纯粹为了学习正则,自己不看正则语法是没用的无论针对<li>还是<div>的正则,preg_match_all都是可以全部匹配的,只是输出在数组的哪个位置而已正则首要点是,必须要有共性和特性并存,共性找出范围,特性找出你想要的
    像你所说的多个div,就是只有共性,没有特性(正则不能计算,无法把"最后一个"作为特性);
    这就需要二次处理,第一次把"div"作为特性,把所有div选出来,然后通过其他方式把“最后一个”这个特性选出来xpath有简单计算函数,就能把共性“div”和特性“最后一个”同时找出来