<table>
<tr><td>...</td></tr>
<tr><td><table>...</table><td></tr>
</table>
この入れ子がいくつになってもマッチする正規表現を教えてください。
自分が試しに書いてみたのはこれですが、2番目以降の</table>タグが残ってしまうようです。
/<table.*?>.*?(:?<table.*?>.*?<\/table>)*.*?<\/table>/ms
例としては3重までネストさせてますが4重でも5重でも正規表現部分はそのままです。
$a = "<body><table><tr><td><table><tr><td><table>...</table></td></tr></table></td></tr><tr><td><table>...</table><td></tr></table></body>"; $a =~ /(<table(.*|<table[^<table]*<\/table>)<\/table>)/ig; print $1;
上記を動かした結果として
<table><tr><td><table><tr><td><table>...</table></td></tr></table></td></tr><tr><td><table>...</table><td></tr></table>
が得られます。
以上とりあえずActivePerl v5.8.8で作ってみました(元データに改行コードは含まないものとしています)。
処理系が異なる場合は動かないかもしれません(Perl、PHP、JAVA、VBScriptなどなど、、、正規表現には微妙に違いがあります)ので適宜改造いただくか、もしくはお使いの処理系とバージョンを私への返答に含んでいただければ、その方面が得意な方が回答を寄せてくださると思います。
PHPでpreg_match使っています。