header('Content-Type:text/html;charset=gb2312');
$str = '
<tr bgcolor="white" width="100%" height="30">
<td style="text-align: center;" bgcolor="#ebe9e4" height="24">12000元 </td>
</tr><tr bgcolor="white" width="90%">
<td colspan="4" height="24">
<div style="text-align: right;">
<span style="color: rgb(0, 0, 0);">信息采集;09-11-13 制表: </span>
<a target="_blank" href=" http://www.xxx.com.cn/"> 某某</a>
</div>
</td>
</tr><tr  bgcolor="white" width="80%">
<td  style="text-align: center;">某某 </td>
</tr>';
以上是要被匹配的字符.其中</tr>与<tr>之间是否有换行\r\n.这个是不确定的匹配要求
    1. 匹配 <tr>.... </tr>之间的内容 
    2. <tr>与 </tr>之间包含有 "采集" 2个汉字
    3. <tr>与 </tr> 不能再次出现 <tr> 或者 </tr>标签 
    要求满足以上3点,如果要我给出被匹配的结果就应该是<tr bgcolor="white" width="90%">
<td colspan="4" height="24">
<div style="text-align: right;">
<span style="color: rgb(0, 0, 0);">信息采集;09-11-13 制表: </span>
<a target="_blank" href=" http://www.xxx.com.cn/"> 某某</a>
</div>
</td>
</tr>我写的正则
preg_match('/<tr.*?>.*?采集.+?<\/tr>/s',$str,$out);
缺点 .*?采集 这个地方的.*?已经把第一行给匹配了.但需要排除第一行的tr标签,因为他里面并没有包含采集2个汉字.
问了很多人了.自己测试很多次,在这里帖子也发了好多次帖了.沉下去了.忘高手解答.
总结了一下 .*? 这个只支持向后 非贪婪匹配.但我想知道是否有向前也非贪婪匹配.也就是取 采集 这2个字之前的第一个<tr> 标签即可.

解决方案 »

  1.   

    .*? 也包括前面的<tr>...</tr>,所以这样就导致了多了前面的一个tr
      

  2.   

    MS也只能用这个折中的办法了.
    $str = '
    <tr bgcolor="white" width="100%" height="30">
    <td style="text-align: center;" bgcolor="#ebe9e4" height="24">12000元 </td>
    </tr><tr bgcolor="white" width="90%">
    <td colspan="4" height="24">
    <div style="text-align: right;">
    <span style="color: rgb(0, 0, 0);">信息采集;09-11-13 制表: </span>
    <a target="_blank" href=" http://www.xxx.com.cn/"> 某某</a>
    </div>
    </td>
    </tr><tr  bgcolor="white" width="80%">
    <td  style="text-align: center;">某某 </td>
    </tr>';
    function test($matches)
    {
      if(strpos($matches[0], "采集"))
      {
        return $matches[0];
      }
    }
    echo preg_replace_callback("/<tr[^\>]+>.*?<\/tr>/s","test", $str);
      

  3.   

    不需要“纯正则”吧?<pre>
    <?php
    $str = '
    <tr bgcolor="white" width="100%" height="30">
    <td style="text-align: center;" bgcolor="#ebe9e4" height="24">12000元 </td>
    </tr><tr bgcolor="white" width="90%">
    <td colspan="4" height="24">
    <div style="text-align: right;">
    <span style="color: rgb(0, 0, 0);">信息采集;09-11-13 制表: </span>
    <a target="_blank" href=" http://www.xxx.com.cn/"> 某某</a>
    </div>
    </td>
    </tr><tr  bgcolor="white" width="80%">
    <td  style="text-align: center;">某某2 </td>
    </tr><tr bgcolor="white" width="100%" height="30">
    <td style="text-align: center;" bgcolor="#ebe9e4" height="24">12000元 </td>
    </tr><tr bgcolor="white" width="90%">
    <td colspan="4" height="24">
    <div style="text-align: right;">
    <span style="color: rgb(0, 0, 0);">信息采集;09-11-15 制表: </span>
    <a target="_blank" href=" http://www.xxx.com.cn/"> 某某2</a>
    </div>
    </td>
    </tr><tr  bgcolor="white" width="80%">
    <td  style="text-align: center;">某某 </td>
    </tr>';
    $out = $arr = array();
    preg_match_all('#<tr[^>]*>.*</tr>#Us',$str,$out);
    foreach ($out[0] as $v) {
    if (strstr($v, '采集') !== FALSE) $arr[] = $v;
    }
    var_dump($arr);
    ?>
    </pre>
      

  4.   

    您真是分太多了
    $str = '
    <tr bgcolor="white" width="100%" height="30">
    <td style="text-align: center;" bgcolor="#ebe9e4" height="24">12000元 </td>
    </tr><tr bgcolor="white" width="90%">
    <td colspan="4" height="24">
    <div style="text-align: right;">
    <span style="color: rgb(0, 0, 0);">信息采集;09-11-13 制表: </span>
    <a target="_blank" href=" http://www.xxx.com.cn/"> 某某</a>
    </div>
    </td>
    </tr><tr  bgcolor="white" width="80%">
    <td  style="text-align: center;">某某 </td>
    </tr>';
    preg_match('/.*(<tr.*?>.*?采集.+?<\/tr>)/s',$str,$out);
    echo $out[1]; <tr bgcolor="white" width="90%">
    <td colspan="4" height="24">
    <div style="text-align: right;">
    <span style="color: rgb(0, 0, 0);">信息采集;09-11-13 制表: </span>
    <a target="_blank" href=" http://www.xxx.com.cn/"> 某某</a>
    </div>
    </td>
    </tr>
      

  5.   

    不是我分多,是你想太简单了.你的正则明显是有问题的.
    你这样会把前面的tr也匹配出来的.所以你这个正则的结果应该是<tr bgcolor="white" width="100%" height="30">
    <td style="text-align: center;" bgcolor="#ebe9e4" height="24">12000元 </td>
    </tr><tr bgcolor="white" width="90%">
    <td colspan="4" height="24">
    <div style="text-align: right;">
    <span style="color: rgb(0, 0, 0);">信息采集;09-11-13 制表: </span>
    <a target="_blank" href=" http://www.xxx.com.cn/"> 某某</a>
    </div>
    </td>
    </tr> 会多出前面那个tr.而我恰恰不要前面那个tr,要排除它.为什么? 因为 ".*?采集"  这里的这个.*?已经包含了<tr></tr>这个标签.我想排除它
      

  6.   

    xuzuning汗.是我眼花了.你是对的.兄弟,小弟在此感谢100分给你了.