[PHP-users 21189]Re: ネストされたタグを正規表現で抽出する場

Katsuo Mogi mogi-k2 @ msg.biglobe.ne.jp
2004年 4月 8日 (木) 15:46:36 JST


おせわになります。茂木です。
レスいただき、正規表現も書き直していただきありがとうございます。

In the message [PHP-users 21180] Re: ネストされたタグを正規表現で抽出する場
               <16387C3B-890C-11D8-92BC-0050E4D9D96F @ offside.ne.jp>
Eiji Miwa <miwa @ offside.ne.jp> wrote:

>  preg_match (  
> '/<table[^>]*>(?:(?>(?:(?!<\/?table[^>]*>).)*)|(?R))*<\/table>/si',  
> $string, $matches );
>  たぶん、こんな感じでうまくいくんじゃないでしょうか。

前のメールに載せたHTMLはきちんと動いてくれたのですが、
今度はこの

$string2 = '<body>
  <table cellspacing="0">
    <tr>
      <td id="rightcolumn">
        <!-- Start right blocks loop -->
                  <div class="blockTitle">ヘッドラインブロック</div>
<div class="blockContent"><p><a href="http://www.xoops.org/" target="_blank">XOOPS Official Website</a><br />

<ul>
    <li><a href="http://example.com/modules/xoopsheadline/index.php?id=1#http://www.xoops.org/modules/news/article.php?storyid=1381">chillout.org.uk :: a XOOPS implementation with mostly static content</a></li>
      <li><a href="http://example.com/modules/xoopsheadline/index.php?id=1#http://www.xoops.org/modules/news/article.php?storyid=1380">End of Life for Red Hat 9.0</a></li>
      <li><a href="http://example.com/modules/xoopsheadline/index.php?id=1#http://www.xoops.org/modules/news/article.php?storyid=1379">CraftsOnline South Africa goes live</a></li>
      <li><a href="http://example.com/modules/xoopsheadline/index.php?id=1#http://www.xoops.org/modules/news/article.php?storyid=1378">xcGallery for XOOPS Multilanguage</a></li>
      <li><a href="http://example.com/modules/xoopsheadline/index.php?id=1#http://www.xoops.org/modules/news/article.php?storyid=1377">New Theme from PetitOOps</a></li>
      <li><a href="http://example.com/modules/xoopsheadline/index.php?id=1#http://www.xoops.org/modules/news/article.php?storyid=1376">FnGeeks.net Joins the Xoops Community</a></li>
      <li><a href="http://example.com/modules/xoopsheadline/index.php?id=1#http://www.xoops.org/modules/news/article.php?storyid=1375"> XOOPS CMS/Microsoft Applications Deal 的nevitable</a></li>
      <li><a href="http://example.com/modules/xoopsheadline/index.php?id=1#http://www.xoops.org/modules/news/article.php?storyid=1373">New XOOPS Image</a></li>
      <li><a href="http://example.com/modules/xoopsheadline/index.php?id=1#http://www.xoops.org/modules/news/article.php?storyid=1372">Tplleguestats RC1 released</a></li>
      <li><a href="http://example.com/modules/xoopsheadline/index.php?id=1#http://www.xoops.org/modules/news/article.php?storyid=1371">Musical Portal in Hungary</a></li>
  </ul></p>
</div>                <!-- End right blocks loop -->
      </td>
    </tr>
  </table>
</body>';

HTMLを処理させると、やはりInternal Server Errorとなってしまいます。
また例が大きくてすいません。実際は前回のと今回の内容は1つのファイルです。

正規表現に問題があるのか、PCREの限界なのか
(Perlだと
$regexp = qr/<table[^>]*>(?:(?>(?:(?!<\/?table[^>]*>).)*)|(??{$regexp}))*<\/table>/si;
while ($string2 =~ /($regexp)/g) {
  print $1, "\n";
}
で行けるようです)かなり手詰まり状態になっております。

> > class="menuMain"という属性が付いているaタグの行を1つでも消すと動くようなので、
> > $stringが長すぎ(タグの入れ子が深すぎ?)なのでしょうか?

>  推測ですが、修飾子に「x」があるので php が class を定義しようとして
>  parse error になってしまっているのかもしれません。

x修飾子をつけても、前のHTMLは動くようです。

引き続き、皆様のご教授願えますでしょうか?

# 最終的にやりたいことは、Webアプリの自動テストです。
# 今はXOOPSの自作モジュールをテストしたくてこのようなHTML
# をいじくっております。
# PerlやRubyにはフレームワークが存在してますがPHPはこれからなのでしょうか・・・。

--
---------------------------------
 茂木克夫
    mogi-k2 @ msg.biglobe.ne.jp
---------------------------------


PHP-users メーリングリストの案内