[PHP-users 34208] preg_match_allでの正規表現について

田中武義 t.takeyoshi @ gmail.com
2008年 12月 23日 (火) 14:58:02 JST


みなさんはじめまして。
Takeと申します。

今回みなさんにご相談したいのはPHPのシステム関数の挙動についてというよりも
正規表現の問題なのかもしれません。

○ 環境
---
Linux(CentOS5.2)
PHP 5.1.6 (cli)

○ 要件
--
あるhtmlソース内にform要素が繰り返し記述されています。
これを正規表現でマッチングさせてformタグ部分のみ取得したいのです。


対象のHTMLソースを簡潔にまとめますと以下のようなものです。
二組のformが繰り返し出力されています。

/////////////////////////////////////////////////////////////////////////
<html>
<head></head>
<body>

<!-- 繰り返し部分 -->
<form name="Aform" method="post" action="XXXX">
フォーム要素
</form>
<form name="Bform" method="post" action="XXXX">
フォーム要素
</form>

・・・ループ・・・

<form name="Aform" method="post" action="XXXX">
フォーム要素
</form>
<form name="Bform" method="post" action="XXXX">
フォーム要素
</form>
<!-- 繰り返し部分ここまで -->
</body>
</html>
////////////////////////////////////////////////////////////////////////////////

このソースのうち
<form name="Aform" method="post" action="XXXX">
フォーム要素
</form>
の部分だけをすべて取得したいのです。


○ 現状(※ HTMLはPEARのHTTP_Requestで取得済みと前提)
-----
$html = すべてのHTMLソース;

$matches = array();
$pattern = "/<form name=\"Aform\".*</form>/is";
preg_match_all($pattern,$html,&$matches);

とすると$matchesの中にマッチングした要素として最初のAformから最後のBformまでが全て1要素として入ってきてしまうのです。

  <form name="Aform" method="post" action="XXXX">
  フォーム要素
  </form>
  <form name="Bform" method="post" action="XXXX">
  フォーム要素
  </form>

  ・・・ループ・・・

  <form name="Aform" method="post" action="XXXX">
  フォーム要素
  </form>
  <form name="Bform" method="post" action="XXXX">
  フォーム要素
  </form>

本来は個々の

  <form name="Aform" method="post" action="XXXX">
  フォーム要素
  </form>

が別要素として$matchesに格納されて欲しいのです。


*************************
ちなみに正規表現にてisの指定を除き、

$pattern = "/<form name=\"Aform\".*/";
preg_match_all($pattern,$html,&$matches);

としてみると
$matchesに「<form name="Aform" method="post" action="XXXX">」が全て別要素として
個数分取得できます。
**************************

以上です。
解りにくい概要説明で申し訳ございません。
ご助力いただけると幸いです。

take


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