正则:
<a(.*)href=[\"\'](.*)[\"\']><div class=\"plst\"><b>(.*)</b></div></a>内容:
<li>str</li><li><a href="/x.html">标题一</a></li><a href="/BAMC"><div class="plst"><b>标题二</b></div></a>目标:(必须包含<div class="plst"><b>)
<a href="/BAMC"><div class="plst"><b>标题二</b></div></a>
当前错误结果:(匹配成了整段了)
<a href="/x.html">标题一</a></li><a href="/BAMC"><div class="plst"><b>标题二</b></div></a>

解决方案 »

  1.   

    是这个意思吗$str = '<li>str</li><li><a href="/x.html">标题一</a></li><a href="/BAMC"><div class="plst"><b>标题二</b></div></a>';
    preg_match_all("/<a.*?><div class=\"plst\"><b>(.*)<\/b><\/div><\/a>/is",$str,$match);
    echo "<pre>";
    print_r($match);
      

  2.   

    正确结果:
    <a href="/BAMC"><div class="plst"><b>标题二</b></div></a>当前错误结果:
    <a href="/x.html">标题一</a></li><a href="/BAMC"><div class="plst"><b>标题二</b></div></a>我试了你这个,还是匹配了下面这种结果。
      

  3.   


    preg_match_all("/<a.*?><div class=\"plst\"><b>(.*)<\/b><\/div><\/a>/isU",$str,$match);//加上U,禁止贪婪模式
      

  4.   

    该死的csdn
    preg_match_all("/<a.*?><div class=\"plst\"><b>(.*)<\/b><\/div><\/a>/isU",$str,$match);
      

  5.   

    好象不是贪婪的问题,因为他在匹配到结果就立即结束了。加了U$str = '<li>str</li><li><a href="/x.html">标题一</a></li><a href="/BAMC"><div class="plst"><b>标题二</b></div></a>';
    preg_match_all("/<a.*?><div class=\"plst\"><b>(.*)<\/b><\/div><\/a>/U",$str,$match);
    echo "<pre>";
    print_r($match);
    结果:
    <pre>Array
    (
        [0] => Array
            (
                [0] => <a href="/x.html">标题一</a></li><a href="/BAMC"><div class="plst"><b>标题二</b></div></a>
            )    [1] => Array
            (
                [0] => 标题二
            ))
      

  6.   

    该死的csdn
    preg_match_all("/<a.*?><div class=\"plst\"><b>(.*)<\/b><\/div><\/a>/isU",$str,$match);结果:Array
    (
        [0] => Array
            (
                [0] => <a href="/x.html">标题一</a></li><a href="/BAMC"><div class="plst"><b>标题二</b></div></a>
            )    [1] => Array
            (
                [0] => 标题二
            ))
    前面一堆这个还是多余存在的:
    <a href="/x.html">标题一</a></li>
      

  7.   

    给个提醒
    匹配一些有边界的内容,应以 边界+排除边界+边界 这样的形式写正则,避免随意地用圆点
    尤其是html等标记语言,因为标记语言的特性就是标记,中间含有换行也是合法的,圆点不能涵盖,随便用圆点就有点想当然认为源字串一定工整了
    举个极端例子如:
    <a
     href="
    abc/abc.html">
    ABC
    </a>
    这段html字串完全合法,一点都不影响网页的显示,但正则就要想好了"[^"]*"
    <[^>]+>
    <a ……>[^<]*</a>
      

  8.   

    $s =<<< TXT
    <li>str</li><li><a href="/x.html">标题一</a></li><a href="/BAMC"><div class="plst"><b>标题二</b></div></a>
    TXT;
    preg_match('/.+(<a.+?<div class="plst".+?a>)/is', $s, $m);
    echo $m[1];<a href="/BAMC"><div class="plst"><b>标题二</b></div></a>
      

  9.   

    再简化一下preg_match('/.+(<a.+?class="plst".+?a>)/is', $s, $m);
    echo $m[1];
    /*
    <a href="/BAMC"><div class="plst"><b>标题二</b></div></a>
    */