被匹配的字符串
    <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>匹配说明.
1 匹配<tr>....</tr>之间的内容
2 <tr>与</tr>之间包含有 "采集" 2个汉字
3 <tr>与</tr> 不能再次出现<tr> 或者 </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>/s
但这样匹配结果包含了第一行tr

解决方案 »

  1.   

    你使用的正则是正确的
    $text = <<< HTML
    <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> 
    HTML;$p = "/ <tr.*?>.*?采集.+? <\/tr>/s";
    preg_match_all($p, $text, $reg);
    print_r($reg);Array
    (
        [0] => Array
            (
                [0] =>  <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>
            ))
      

  2.   

    楼上正解,如果实际情况不符的话,请用/m修正符替换/s,或者/ms都用m (PCRE_MULTILINE) 默 认情况下,PCRE 将目标字符串作为单一的一“行”字符所组成的(甚至其中包含有换行符也是如此)。“行起始”元字符(^)仅仅匹配字符串的起始,“行 结束”元字符($)仅仅匹配字符串的结束,或者最后一个字符是换行符时其前面(除非设定了 D 修正符)。这和 Perl 是一样的。  当设定了此修正符,“行起始”和“行结束”除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前。这和 Perl 的 /m 修正符是等效的。如果目标字符串中没有“\n”字符或者模式中没有 ^ 或 $,则设定此修正符没有任何效果。   s (PCRE_DOTALL) 如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。这和 Perl 的 /s 修正符是等效的。排除字符类例如 [^a] 总是匹配换行符的,无论是否设定了此修正符。 
      

  3.   

    错了.准确来说/ <tr.*?>.*?采集.+? <\/tr>/s  这个应该是/<tr.*?>.*?采集.+? <\/tr>/s  这样子,没有前面那个空格,同时原始字符穿的那个tr标签前也不应该有那个空格.又出了点小毛病.太粗心了.
      

  4.   

    不.应该是csdn给自动加了空格.
      

  5.   

    $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>';[color=#0000FF]匹配说明.
    1 匹配 <tr>.... </tr>之间的内容
    2 <tr>与 </tr>之间包含有 "采集" 2个汉字
    3 <tr>与 </tr> 不能再次出现 <tr> 或者 </tr>标签 
    preg_match('/<tr.*?>.*?采集.+?<\/tr>/s',$str,$out);[/color]一楼的+了空格.但实际上是并没有空格的.这里重新来过
      

  6.   

    建议先匹配<tr></tr>中间的,再查找匹配数组中是否包含'采集'二字.
      

  7.   

    你给的式子是对的,现在又说不对了。看看这个,然后再说什么不对吧$p = "/.*(<tr.*>.*采集.+ <\/tr>)/s";
    preg_match_all($p, $text, $reg);
    echo $reg[1];
      

  8.   


    你这个我给你举个例子吧<tr><td>1></td></tr><tr><td>5555采集5555</td></tr><tr><td>3</td></tr>
    按照你个的正则,或者我原有的/<tr.*?>.*?采集.+?<\/tr>/s 
    这样匹配的结果会是
    <tr><td>1></td></tr><tr><td>5555采集5555</td></tr>
    吧第一行也包含了.因为.*?采集 这里的.*?这个代表了任意字符,同时也包含了<tr></tr>标签
      

  9.   

    1: 用m修饰。
    2: .在perl正则中能代表换行取决于修饰符号
      

  10.   

    $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);