首先给楼主分析一下出错的原因,/<table.*表格二.*<\/table>/is的匹配范围为你这个$c的全部,应当用最小匹配.*?的形式,这是没有写过Perl,直接学PHP的网友经常忽略的问题。
其次,二级嵌套表格基本上不能用一个表达式来匹配内层的表格,需要分步处理,一个简单的方法是利用回调函数,在回调函数再使用最大匹配来保留外层表格。
例如楼主的表达式可以写成:
function do_replace($m)
{
preg_match('/(<table .*)<table /is', $m[0], $match);
return $match[1].'xxxxxxxx';
}
$c=preg_replace_callback('/<table .*?表格二.*?<\/table>/is', 'do_replace', $c);
虽然代码比较简陋防不住二级嵌套(注:要防二级嵌套需重复调用preg_replace_callback这句话两次,依此类推),但应该可以满足楼主的需求。另外,在这里我作为一个从Perl转到PHP的程序员,也希望包括楼主在内的各位学PHP网友有空时能顺便学一下Perl

解决方案 »

  1.   

    匹配默认是贪婪模式,而且是从开始匹配,当然先匹配第一个<table>了,最好是能找到不同特征会比较好点,比如说给那个table加个id,<table id='uid'>,然后这样去匹配就可以了。
      

  2.   

    这倒不一定要用正则的
    几个strpos就可以了
      

  3.   

    如果只有两个table可以这样:
    $c=preg_replace("/(<table.*?)(<table.*?表格二.*?<\/table>)(.*?<\/table>)/is","$1$3",$c);
    大于2个,以此类推
      

  4.   

    首先查找"表格二"
    然后从"表格二"往上找"<table ",往下找"</table>"