<?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,
 
       );
 
       
 
    }
 
    
 
    
 
    
 
}
 
 
 
 
?>
 
 |