Location: PHPKode > scripts > Form fields > form-fields/form_fields.php
<?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,
       );
       
    }
    
    
    
}



?>
Return current item: Form fields