需從任意 HTML 頁面提取所有表單結構 (action、method、input/select/textarea 的 name/type/value/options) 以建立自動化測試、爬蟲或安全掃描器。本文提供完整正則解析器實作,逐層拆解 form → 元素 → 屬性。
<form action="register.php" method="post">
<input type="hidden" name="cookie" value="SJKjki80KJ8jkl2" />
<input type="text" name="name" required />
<input name="password" type="password" required="required" />
<input name="age" value="22" required />
<input type="radio" name="sex" value="1" /> 男
<input type="radio" name="sex" value="0" /> 女
<select name="area">
<option value="jiangsu">江蘇</option>
<option value="shandong">山東</option>
</select>
<textarea name="summary">個人簡介</textarea>
<input type="submit" name="register" value="註冊" />
</form>
<form action="login.php" method="post">
<input type="text" name="name" required />
<input name="password" type="password" />
<textarea name="remark">2</textarea>
<input type="submit" name="register" value="登入" />
</form>
<?php
function parse_forms($html) {
$forms = [];
// 1. 擷取所有 區塊 (s 單行模式讓 . 匹配換行)
if (!preg_match_all('/
Array
(
[0] => Array
(
[action] => register.php
[method] => post
[inputs] => Array
(
[0] => Array ( [name] => cookie [type] => hidden [value] => SJKjki80KJ8jkl2 )
[1] => Array ( [name] => name [type] => text [value] => )
...
)
[textarea] => Array ( [0] => Array ( [name] => summary [value] => 個人簡介 ) )
[select] => Array
(
[0] => Array ( [name] => area [options] => Array ( [0] => jiangsu [1] => shandong ) )
)
)
[1] => Array ( ... login form ... )
)
$dom = new DOMDocument();
@$dom->loadHTML($html); // 抑制 HTML5 標籤警告
$xpath = new DOMXPath($dom);
$forms = $xpath->query('//form');
foreach ($forms as $form) {
$action = $form->getAttribute('action');
$inputs = $xpath->query('.//input', $form);
// ... 結構化提取,健壯度遠超正則
}