| 
<?php
 /*
 class deciphers a <form> and its field names and values from a given $html string
 
 can return data as array list
 ->form_to_data()
 
 or inject into browser/http object
 ->apply_form()
 
 */
 class form_fields {
 
 
 
 // init HTTP_Request object from $HTML string
 function apply_form(&$browser, $HTML_form) {
 
 // get fields
 extract( $this->form_to_data($HTML_form) );
 
 // fill out browser object
 $browser->setMethod($method);
 $browser->setURL($url);
 #       $browser->type($enctype);
 foreach ($data as $name=>$val) {
 foreach ($val as $value=>$desc) {
 if (strlen($name)) {
 $browser->setPostData($name, $value);
 }
 }
 }
 
 }
 
 
 
 // decode HTML <form> into browser object
 function form_to_data($HTML_form) {
 
 // extract from first <form> block
 if (preg_match("/<form.+?<\/form[^>]*>/ims", $HTML_form, $uu)) {
 $form = $uu[0];
 
 // fetch METHOD=
 if (preg_match("/<form[^>]+method=[\"']?(\w+)/ims", $form, $uu)) {
 $method = strtoupper($uu[1]);
 }
 else {
 $method = "GET";
 }
 // and URL=
 if (preg_match("/<form[^>]+?action=[\"']?([^\"'>\s]+)/ims", $form, $uu)) {
 $url = $uu[1];
 }
 else {
 $url = $browser->url;
 }
 
 // and type= if any
 if (preg_match("/<form[^>]+enctype=[\"']?([^\"'>\s]+)/ims", $form, $uu)) {
 $ct = $uu[1];
 }
 else {
 $ct = "application/x-www-form-urlencoded";
 }
 
 // getall fields
 $d = array();
 $d_possible = array();
 preg_match_all("/  (<input[^>]+>)  |  <select[^>]+>(.+?)<\/select  |  <textarea[^>]+>([^<]+)  /xims", $form, $matches);
 #print_r($matches);
 foreach ($matches[0] as $i=>$_full) {
 
 // general fields
 $name = "";
 $value = "";
 $type = "";
 $desc = "";
 if (preg_match("/<[^>]+name=\"(.+?)\"[^>]*>/ims", $_full, $uu)) {
 $name = $uu[1];
 }
 if (preg_match("/<[^>]+value=\"(.+?)\"[^>]*>/ims", $_full, $uu)) {
 $value = $uu[1];
 }
 if (preg_match("/<[^>]+type=\"(.+?)\"[^>]*>/ims", $_full, $uu)) {
 $type = strtolower($uu[1]);
 }
 if (preg_match("/<label[^>]+for=\"$name\"[^>]*>(.+?)<\/label>/ims", $_full, $uu)) {
 $desc = strip_tags($uu[1]);
 }
 $selected = preg_match("/<[^>]+\s(selected|checked)[=>\s]/ims", $_full, $uu);
 
 // input
 if (strlen($matches[1][$i])) {
 
 if (($type != "radio") or ($selected)) {
 $d[$name][$value] = "$desc";
 }
 }
 
 // select
 elseif (strlen($matches[2][$i])) {
 preg_match_all("/<option(?: [^>]+value=[\"']?([^\"'>]*)[^>]* )?>([^<]*)/xims", $_full, $uu);
 foreach ($uu[1] as $n=>$value) {
 
 // either from value= or plain text following opening <option> tag
 $desc = $uu[2][$n];
 if (!$value) {
 $value = $desc;
 }
 
 // only add the allowed ones
 if ($selected = preg_match("/<[^>]+\s(selected|checked)[=>\s]/ims", $uu[0][$n])) {
 $d[$name][$value] = "";
 }
 
 // add possible values + desc
 $d_possible[$name][$value] = trim($desc);
 }
 continue; // but skip base
 }
 
 // textarea
 elseif (strlen($matches[3][$i])) {
 $value = $matches[3][$i];
 $d[$name][$value] = "$desc";
 }
 
 else {
 // ..
 }
 
 // add always
 $d_possible[$name][$value] = "$desc";
 
 }
 }
 #print_r($d);
 #print_r($d_possible);
 
 // multiple return values
 return array(
 "method" => $method,
 "url" => $url,
 "enctype" => $type,
 "data" => $d,
 "data_possible" => $d_possible,
 );
 
 }
 
 
 
 }
 
 
 
 ?>
 |