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