Login   Register  
PHP Classes
elePHPant
Icontem

File: form_fields.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Tanja Berger  >  Form fields  >  form_fields.php  >  Download  
File: form_fields.php
Role: Class source
Content type: text/plain
Description: class file which contains the HTML form extraction methods
Class: Form fields
Parse HTML forms to extract input names and values
Author: By
Last change: desc typo
Date: 7 years ago
Size: 4,698 bytes
 

Contents

Class file image Download
<?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,
       );
       
    }
    
    
    
}



?>