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> 标签即可.
$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);
<?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>
$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>
你这样会把前面的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>这个标签.我想排除它