<?php

$xx='<p>...</p>
<p>...</p>
<table>
<tr>
<td><p>...</p></td>
<td><p>...</p></td>
</tr>
</table>
<p>...</p>';

$mask='<<<%s>>>';
$pl=array();

$yy=preg_replace_callback(
	'~<table>.*?</table>~is',
	function($m) use (&$pl,$mask){
		$pl[]=$m[0];
	    return sprintf($mask,count($pl));
	},
	$xx
);

$tt=preg_replace('/<\/p>/', '</p>text', $yy);

$zz=preg_replace_callback(
	'~'.sprintf(preg_quote($mask,'~'),'(.*?)').'~si',
	function($m) use ($pl){
		return $pl[$m[1]-1];
	},
	$tt
);
print_r($zz);