以下のような、入れ子になっている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 15:06:23
  • 終了:2007/03/05 16:58:16

回答(1件)

id:kn1967 No.1

kn1967回答回数2915ベストアンサー獲得回数3012007/03/05 16:32:51

ポイント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

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

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

トラックバック

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません