PHP: handler in klassen ( speziell xml )

Osbes

Staff member
Administrator
Ex-Admin
UF Supporter
Joined
Oct 24, 2003
Messages
11,481
Reaction score
6
Achtung, dies ist speziell an PHP Coder gerichtet, also wer da keine Ahnung hat kann sich auch die Mühe sparen weiterzulesen ;)
Danke.


Hi,

weiß einer welchen sinn es hat, das ein handler in php nicht aus seiner funktion rauskommt, wenn es in einer klasse ist ?

ich meine mit meinem walkaround ( http://www.united-forum.de/showthread.php?t=46295 ) kann ich es zwar immernoch benutzen und mit

PHP:
xml_set_object($this->parser,&$this);

auch die variablen ansprechen, aber es ist ja nicht gerade das wahre ständig aus der klasse rauszugehen um sie anzusprechen, obwohl man in der gleichen bleiben will ...


wenn das so weiter geht schreib ich mir nen eigenen xml handler ... ist doch scheiße 1001 funktion zu erstellen...
 
so, ich habe mir jetzt selbst was zurecht gebastelt:

PHP:
class vsm extends parser {
	
function vsm() {
  $this->options = array('data'          => NULL,
	                     'tag_start'     => NULL,
	                     'tag_end'       => NULL,
	                     'attribute'     => NULL);
  $this->return = NULL;
}
	
function vsm_set_option($name,$value) {
	
}

function vsm_set_handler($name,$function) {
	$this->parser[$name] = $function;
}

function vsm_set_parser($namespace=':') {
	if (!empty($namespace))
	  $this->options['namespace'] = $namespace;
}

function vsm_parse($data) {
	
$parser = $this->parser;

ob_start();
while($data == true) {
  $hash = md5($data);

  $parse = substr($data,0,strpos($data,'<'));
  $data = substr_replace($data,'',0,strlen($parse));
  if (!empty($parse) && !empty($parser['data']))
    $this->return .= $this->$parser['data']($parse);
  
  $parse = substr($data,1,(strpos($data,'>')));
  $data = substr_replace($data,'',0,(strlen($parse)+1));
  
  if ($parse[0]== '/') {
  	$parse = substr($parse,1,strlen($parse)-2);
  	
  	if (!empty($parser['tag_end']))
      $this->return .= $this->$parser['tag_end']($parse);
  	unset($parse);
  }

  if (!empty($parse)) {
  	$parse = substr($parse,0,strlen($parse)-1);
    $parse = explode(' ',$parse);
  
    $tag_start = explode($this->options['namespace'],array_shift($parse));
    
    if (!empty($parser['tag_start']))
      $this->return .= $this->$parser['tag_start']($tag_start[0]);
    if (!empty($tag_start[1]) && !empty($parser['namespace']))
      $this->return .= $this->$parser['namespace']($tag_start[1]);
    
    foreach ($parse as $attr)
  	  if (preg_match('%^([a-z]+)="([a-z0-9_-]+)"$%sU',strtolower($attr),$value) && !empty($parser['attribute']))
  	   $this->return .= $this->$parser['attribute']($value[1],$value[2]);
     
    if (!empty($parser['tag_start'])) 
  	  $this->return .= $this->$parser['tag_start']('>');
  	}   
  if ($hash == md5($data))
    die('ERROR');
  }
ob_clean(); 
}
   
}

das ganze ist natürlich noch in der testphase, aber es erkennt den queltext immerhin schon genau so wie der olle xml_parser von php.
und ich kann so wirklich auf die funktionen verlinken, die auch zusammenarbeiten ^^

außerdem, wenn ich mir so die größe anschaue ist es scon mal sehr nice geworden :)

insbesondere die möglichkeit der nutzung von extends finde ich viel besser, da ich so auch den code besser strukturieren kann.
 
Last edited:
hier mal ne aktuelle version:

PHP:
<?php
include_once('parser.class.php');

class vsm extends parser {
	
var $return;
var $parser;
var $options;
	
function vsm() {
  $this->options = array('data'          => NULL,
	                     'tag_start'     => NULL,
	                     'tag_end'       => NULL,
	                     'attribute'     => NULL);
  $this->return = NULL;
}
	
function vsm_set_option($name,$value) {
	
}

function vsm_set_handler($name,$function) {
	
  $this->parser[$name] = $function;
}

function vsm_set_parser($namespace=':') {
	
  if (!empty($namespace))
  $this->options['namespace'] = $namespace;
}

function vsm_parse($data) {
	
  $parser = $this->parser;

  ob_start();
  while(!empty($data)) {
    $hash = md5($data);

    $parse = substr($data,0,strpos($data,'<'));
    $data = substr_replace($data,'',0,strlen($parse));
    if (!empty($parse) && !empty($parser['data']))
      $this->return .= $this->$parser['data']($parse);
  
    $parse = substr($data,1,(strpos($data,'>')));
    $data = substr_replace($data,'',0,(strlen($parse)+1));
  
    if ($parse[0]== '/') {
  	  $parse = substr($parse,1,strlen($parse)-2);
  	
  	  if (!empty($parser['tag_end']))
        $this->return .= $this->$parser['tag_end']($parse);
  	  unset($parse);
    }

    if (!empty($parse)) {
  	  $parse = substr($parse,0,strlen($parse)-1);
      $parse = explode(' ',$parse);
  
      $tag_start = explode($this->options['namespace'],array_shift($parse));
    
      if (!empty($parser['tag_start']))
        $this->return .= $this->$parser['tag_start']($tag_start[0]);
      if (!empty($tag_start[1]) && !empty($parser['namespace']))
        $this->return .= $this->$parser['namespace']($tag_start[1]);
    
      foreach ($parse as $attr)
  	    if (preg_match('%^([a-z]+)="([a-z0-9_-]+)"$%sU',strtolower($attr),$value) && !empty($parser['attribute']))
  	     $this->return .= $this->$parser['attribute']($value[1],$value[2]);
     
      if (!empty($parser['tag_start'])) 
  	    $this->return .= $this->$parser['tag_start']('>');
  	}   
    if ($hash == md5($data))
      die('ERROR');
  }
  if(ob_get_clean())
    trigger_error(__CLASS__.':'.__FUNCTION__.':001');
}

function vsm_parse_free() {

  $this->parser = NULL;
  $return = $this->return;
  $this->return = NULL;
  return $return;
}
	  
}
?>

und der parser kann dann zb mit ner build klasse erstellt werden, um übersicht zu halten :o
 
Back
Top