人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPの正規表現についてです。
ちょっと説明が難しいのですが・・・拙いですがすみません。
たとえば以下のようなメールなど入力フォームのあるHTMLがあるとします。
<body>
<form>
入力1:<input type="text" name="○○○">
入力2:<select name="△△△">
<option>xxxx</option>
<option>xxxx</option>
</select>
入力3:<input name="□□□" type="radio" value="xxx">xxx
<input name="□□□" type="radio" value="xxx">xxx
<input name="□□□" type="radio" value="xxx">xxx
<input type="submit" value="送信">
</form>
</body>

それぞれのタグ(inputやselect)を各々のname属性(○○○、△△△、□□□)に置換したいです。

<body>
入力1:○○○
入力2:△△△
入力3:□□□
</body>

以下のようなものを要素ごとに繰り返してみたんですが、
preg_replace('/(.*)<input[\s]+[^>]*?name=["\'](.*?)["\'].+[>$]?(.*)/i','$1$2$3',$html);
<select>なんかは<option>や</select>は置換されず、ラジオボタンは個数分全て出てきてしまいます。
ちなみに具体的な用途は、それぞれのname属性を$_POST['○○○']として自動的に受け取って、入力確認として表示したいというものです。
よろしくお願いします。

●質問者: indiana
●カテゴリ:インターネット ウェブ制作
✍キーワード:HTML name PHP SELECT XXXX
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● tezcello
●100ポイント

$html = <<<EOL
<body>
<form>
入力1:<input type="text" name="○○○">
入力2:<select name="△△△">
    <option>xxxx</option>
    <option>xxxx</option>
    </select>
入力3:<input name="□□□" type="radio" value="xxx">xxx
    <input name="□□□" type="radio" value="xxx">xxx
    <input name="□□□" type="radio" value="xxx">xxx
入力4:<select name="●●●">
    <option>xxxx</option>
    <option>xxxx</option>
    </select>
<input type="submit" value="送信">
</form>
</body>

EOL;


// form タグとそれ以外の分離
preg_match('/(.*?)<form[^>]*?>(.*?)<\/form>\s?(.*)/s', $html, $elms);

// input タグ、select タグを抜き出す
preg_match_all('/\s(.*?)<(input|select).*?name="([^"]+)"/',$elms[2], $res, PREG_SET_ORDER);

foreach ($res as $r){
if (isset($tags[$r[3]])) continue;// 同じ名前で登録をしない<=ラジオボタンを1回だけ登録する為
// 抜き出したタグのname属性で配列を作る
$tags[$r[3]] = $r[1];
}

// これ以降はオマケです。質問文の希望出力結果に合わせてみました。
$result = $elms[1];
foreach ($tags as $name => $preword){
$result .= $preword.$name."\n";
}
$result .= $elms[3];

print_r($result);

結果が

<body>
入力1:○○○
入力2:△△△
入力3:□□□
入力4:●●●
</body>

複数のformがある場合は考慮していません。

◎質問者からの返答

ありがとうございます。試させていただきました。

name部分は抽出できるのですが、「置換」がうまくいかないようです。

(質問文がわかりにくいんですけどね・・・汗)

以下のHTMLで試してみました。

------------------------------------------

<body>

<form>

<table>

<tr>

<th>項目1</th>

<td><input type="text" name="itemA" value=""></td>

</tr>

<tr>

<th>項目2</th>

<td><textarea name="itemB"></textarea></td>

</tr>

<tr>

<th>項目3</th>

<td>

<select name="itemC">

<option value="z">z

<option value="y">y

<option value="x">x

</select>

</td>

</tr>

<tr>

<th項目4</th>

<td>

<input type="radio" name="itemD" value="w">w

<input type="radio" name="itemD" value="v">v

<input type="radio" name="itemD" value="u">u

</td>

</tr>

<tr>

<th項目5</th>

<td>

<input type="checkbox" name="itemE" value="t">t

<input type="checkbox" name="itemE" value="s">s

<input type="checkbox" name="itemE" value="r">r

</td>

</tr>

<tr>

<td colspan="2"><input type="submit" value="送信"></td>

</tr>

</table>

</form>

</body>

------------------------------------------

結果は

------------------------------------------

<body>

<td>itemA

<td>itemB

itemC

itemD

itemE

</body>

------------------------------------------

となりました。

理想としては

------------------------------------------

<body>

<form>

<table>

<tr>

<th>項目1</th>

<td>itemA</td>

</tr>

<tr>

<th>項目2</th>

<td>itemB</td>

</tr>

<tr>

<th>項目3</th>

<td>itemC</td>

</tr>

<tr>

<th項目4</th>

<td>itemD</td>

</tr>

<tr>

<th項目5</th>

<td>itemE</td>

</tr>

<tr>

<td colspan="2"></td>

</tr>

</table>

</form>

</body>

------------------------------------------

としたいです。

長いソースばかりで読みにくいですが・・・

というか質問の例題も説明不足ですね・・・すみません。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ