Scripts
Website structuur class
Deze class is bedoeld om je te helpen bij bijv. het herprogrammeren van een site. Je kan meerdere dingen doen: 1. De inhoud van het bestand voorbereiden, door bijv. comments eruit te halen. 2. Aangeven met welke regexes er moet worden gezocht naar bestanden, wat er dus ook voor zorgt dat je bijv. naar plaatjes kan zoeken in een HTML bestand 3. Aangeven hoe de bestanden moeten worden weergegeven En nog wat andere dingetjes;) Om alle bestanden te bekijken, kun je naar http://crewleden.gamercc.com/source.php gaan. Ik hoop dat jullie er iets aan hebben, maar ook dat het gewoon goed is, 't is namelijk mijn eerste scriptje;) (btw, ik heb m'n best gedaan zo goed mogelijk commentaar erbij te zetten) Veel plezier!
website-structuur-class
<?php
class structure
{
private $structure;
private $variables;
private $contents;
//Stel een aantal variabelen in
public function __construct($cur_file, $match_name = NULL)
{
//Het bestand dat doorzocht wordt
$this->variables['cur_file'] = $cur_file;
//De naam van de capture group
//Dit mag ook een array zijn, die de match functie
$this->variables['match_name'] = $match_name;
//De array met match regexes, welke op NULL staat zodat wij geen geheugen gaan gebruiken
//Maar toch een regex kunnen toevoegen met []
$this->variables['match_regexes'] = NULL;
//De array met prepare regexes
$this->variables['prep_regexes'] = NULL;
//De array met prepare vervangingen, het is je eigen probleem als je hier niet genoeg dingen doorgeeft;)
$this->variables['prep_replacements'] = NULL;
//De array met modules
$this->variables['modules'] = NULL;
//De array in welke alle matches komen te staan, deze array wordt ook uiteindelijk teruggegeven met display()
$this->structure[$cur_file] = array();
}
//Voeg functies toe om het resultaat te bewerken
//$func_use mag 'each' of 'once' zijn
//'each' betekent dat deze functie moet worden uitgevoerd op ieder element in de array
//'once' betekent dat deze functie slechts 1 keer per bestand wordt uitgevoerd
//(bijv. om een paar bestanden toe te voegen die moeilijk zijn te vinden via het script zelf)
//Iedere module krijgt 3 argumenten mee.
//De eerste kan 2 dingen zijn:
//1. Als de $func_use 'each' is, is het het huidige bestand
//2. Als de $func_use 'once' is, is het de complete structure array
//De andere zijn alle variabelen van het huidige structure object en het huidige structure object zelf ($this)
//(in die volgorde)
//Je hoeft echter niet persee iets te doen met deze argumenten
public function add_module($func_name, $func_use = 'each')
{
$this->variables['modules'][] = array('func_name' => $func_name, 'func_use' => $func_use);
}
//Een 'match regex' toevoegen, welke zegmaar de structuur zullen aangeven
public function add_match($regex)
{
//Omdat preg_match %'tjes voor en na een regex wil hebben, kijken we hier even of die er wel zijn
if(!preg_match('/^%/', $regex))
{
$regex = '%'.$regex;
}
if(!preg_match('/%$/', $regex))
{
$regex = $regex.'%';
}
//En we voegen de regex toe aan de variables array
$this->variables['match_regexes'][] = $regex;
}
//Een 'voorbereid regex' toevoegen, welke op de inhoud los kunnen worden gelaten om bijvoorbeeld commentaren uit PHP script te halen
//Een voorbeeld regex + vervanging (deze regel haalt alle PHP comments uit een bestand)
//$contents = preg_replace('%\/\/.*\r\n|\/\*(?:.*?\r*?\n*?)*?\*\/%', '', $contents);
public function add_prepare($regex, $replacement)
{
//Als de regex al %en heeft, voeg ze niet toe
//In dit geval gebruik ik / om de regex aan te geven, omdat dat hier duidelijker is (t.o.v '%%$%')
if(!preg_match('/^%/', $regex))
{
$regex = '%'.$regex;
}
if(!preg_match('/%$/', $regex))
{
$regex = $regex.'%';
}
$this->variables['prep_regexes'][] = $regex;
$this->variables['prep_replacements'][] = $replacement;
}
//Verwerk de array met bestanden
public function process()
{
//Bereidt de inhoud voor
$this->prepare();
//Zoek de matches
$this->match();
//Mits er modules zijn toegevoegd
if(!is_null($this->variables['modules']))
{
//Voer de modules uit
foreach($this->variables['modules'] as $module)
{
//Als deze module op ieder gevonden bestand moet worden losgelaten
if($module['func_use'] == 'each')
{
//En mits er wel gevonden bestanden zijn
if($this->structure[$this->variables['cur_file']] != NULL)
{
$tmp_structure = NULL;
//Voeren we deze module uit op ieder gevonden bestand
foreach($this->structure[$this->variables['cur_file']] as $tmp_file)
{
$tmp = $module['func_name']($tmp_file, $this->variables, $this);
if(!is_null($tmp))
{
$tmp_structure[$tmp_file] = $tmp;
}
else
{
$tmp_structure[] = $tmp_file;
}
}
$this->structure[$this->variables['cur_file']] = $tmp_structure;
}
}
//Als deze module op de hele array moet worden uitgevoerd
elseif($module['func_use'] == 'once')
{
//Voeren we deze module uit op de array van gevonden bestanden
$this->structure[$this->variables['cur_file']] = $module['func_name']($this->structure[$this->variables['cur_file']], $this->variables, $this);
}
}
}
}
//Een functie om de array weer te geven
public function display($func_name = NULL)
{
//Als er een functie op is gegeven
if(!is_null($func_name))
{
if($func_name == 'array')
{
//Een speciale 'functie', welke ENKEL de array teruggeeft
return $this->structure[$this->variables['cur_file']];
}
else
{
//De functie die op is gegeven
return $func_name($this->structure);
}
}
else
{
//Een standaard teruggave, welke een 'mooie' array weergeeft
return '<pre>'.print_r($this->structure, true).'</pre>';
}
}
//Debug functie om protected/private variabelen te kunnen bekijken
public function debug($var)
{
return $this->$var;
}
//Bereidt de inhoud van het bestand voor (optioneel uiteraard)
private function prepare()
{
$this->contents = $this->get_contents($this->variables['cur_file']);
//Mits er voorbereid regexen en vervangingen zijn toegevoegd
if(!is_null($this->variables['prep_regexes']) && !is_null($this->variables['prep_replacements']))
{
//Zoek in de tekst naar de regex, en vervang deze
$this->contents = preg_replace($this->variables['prep_regexes'], $this->variables['prep_replacements'], $this->contents);
}
}
//De methode om matches te vinden
private function match()
{
//Voor iedere match regex die er is opgegeven
foreach($this->variables['match_regexes'] as $regex)
{
if(is_int(stripos($regex, '(?P<'.$this->variables['match_name'].'>')))
{
//Als er een capture groep is opgegeven, gebruik die
preg_match_all($regex, $this->contents, $matches);
$tmp_structure = NULL;
if(isset($matches[$this->variables['match_name']][0]))
{
foreach($matches[$this->variables['match_name']] as $tmp)
{
$this->structure[$this->variables['cur_file']][] = $tmp;
}
}
}
else
{
//anders, geef gewoon alle matches terug
preg_match_all($regex, $this->contents, $matches);
foreach($matches[0] as $match)
{
$this->structure[$this->variables['cur_file']][] = $match;
}
}
}
//Als er geen matches zijn gevonden, geef een 'mooie' waarde terug
if(!isset($this->structure[$this->variables['cur_file']][0]))
{
$this->structure[$this->variables['cur_file']] = NULL;
}
}
//Inhoud van het bestand ophalen
private function get_contents($file)
{
//Om gewoon zeker te weten dat we niet een niet bestaand bestand proberen te openen
if(file_exists($file))
{
return file_get_contents($file);
}
else
{
return NULL;
}
}
}
?>
Reacties
0