[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 メーリングリストの案内