[PHP-users 21179]ネストされたタグを正規表現で抽出する場合
Katsuo Mogi
mogi-k2 @ msg.biglobe.ne.jp
2004年 4月 8日 (木) 08:46:07 JST
お世話になります。茂木です。
大変ご無沙汰しておりましたが、表題の件でお知恵をお貸しください。
Windows2000
Apache1.3.27
PHP4.3.5 (CGIで動作)
の環境にて、
以下のようなHTMLソースから、トップレベルにあるtableタグ(とその中身)を
抽出したいと思っています。
(なるべく余分な部分は消したのですがサイズ大きくてすいません)
$string = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
</head>
<body>
<table cellspacing="0">
<tr>
<td id="leftcolumn">
<div class="blockContent"><table cellspacing="0">
<tr>
<td id="usermenu">
<a class="menuTop" href="http://example.com/user.php">アカウント情報</a>
<a href="http://example.com/edituser.php">アカウント編集</a>
<a href="http://example.com/notifications.php">イベント通知機能</a>
<a href="http://example.com/user.php?op=logout">ログアウト</a>
<a href="http://example.com/viewpmsg.php">受信箱</a>
<a href="http://example.com/admin.php">管理者メニュー</a>
</td>
</tr>
</table>
</div>
<div class="blockContent"><table cellspacing="0">
<tr>
<td id="mainmenu">
<a class="menuTop" href="http://example.com/">ホーム</a>
<!-- start module menu loop -->
<a class="menuMain" href="http://example.com/modules/sections/">セクション</a>
<a class="menuMain" href="http://example.com/modules/xoopsheadline/">ヘッドライン</a>
<a class="menuMain" href="http://example.com/modules/newbb/">フォーラム</a>
<a class="menuMain" href="http://example.com/modules/news/">ニュース</a>
<a class="menuMain" href="http://example.com/modules/contact/">お問い合わせ</a>
<a class="menuMain" href="http://example.com/modules/mydownloads/">ダウンロード</a>
<a class="menuMain" href="http://example.com/modules/mylinks/">リンク集</a>
<a class="menuMain" href="http://example.com/modules/tinycontent/">tinycontent</a>
<a class="menuMain" href="http://example.com/modules/offer/">求人情報</a>
<a class="menuMain" href="http://example.com/modules/xoopsmembers/">登録ユーザ一覧</a>
<!-- end module menu loop -->
</td>
</tr>
</table></div>
</td>
</tr>
</table>
</body>
</html>';
そして、以下の正規表現を書きました。
preg_match('/(?:<table[^>]*>)(?:(?:(?:(?!<\/?table[^>]*>).)*)|(?R))*<\/table>/sxi', $string, $matches);
var_dump($matches);
ところが、アプリケーションエラーのダイアログが出てInternal Server Error
になってしまいます。
preg_match('/(?:<td[^>]*>)(?:(?:(?:(?!<\/?td[^>]*>).)*)|(?R))*<\/td>/sxi', $string, $matches);
var_dump($matches);
とすると、きちんと一番上位のtdタグのペアの中身にマッチするので正規表現は
合っているのではないかと思うのですが、何かヘマをやらかしているのでしょうか。
class="menuMain"という属性が付いているaタグの行を1つでも消すと動くようなので、
$stringが長すぎ(タグの入れ子が深すぎ?)なのでしょうか?
お気づきの点がございましたら、よろしくお願いします。
--
---------------------------------
茂木克夫
mogi-k2 @ msg.biglobe.ne.jp
---------------------------------
PHP-users メーリングリストの案内