首先给楼主分析一下出错的原因,/<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
其次,二级嵌套表格基本上不能用一个表达式来匹配内层的表格,需要分步处理,一个简单的方法是利用回调函数,在回调函数再使用最大匹配来保留外层表格。
例如楼主的表达式可以写成:
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
几个strpos就可以了
$c=preg_replace("/(<table.*?)(<table.*?表格二.*?<\/table>)(.*?<\/table>)/is","$1$3",$c);
大于2个,以此类推
然后从"表格二"往上找"<table ",往下找"</table>"