以下のような、入れ子になっているtableタグが存在しているとして。

<table>
<tr><td>...</td></tr>
<tr><td><table>...</table><td></tr>
</table>

この入れ子がいくつになってもマッチする正規表現を教えてください。

自分が試しに書いてみたのはこれですが、2番目以降の</table>タグが残ってしまうようです。
/<table.*?>.*?(:?<table.*?>.*?<\/table>)*.*?<\/table>/ms

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2007/03/05 16:58:16
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:kn1967 No.1

回答回数2915ベストアンサー獲得回数301

ポイント60pt

例としては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などなど、、、正規表現には微妙に違いがあります)ので適宜改造いただくか、もしくはお使いの処理系とバージョンを私への返答に含んでいただければ、その方面が得意な方が回答を寄せてくださると思います。

http://downloads.activestate.com/ActivePerl/Windows/5.8/

id:fjkktkys

PHPでpreg_match使っています。

2007/03/05 16:51:26

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません