website-structuur-class
Gesponsorde koppelingen
PHP script bestanden
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
<?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;
}
}
}
?>
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;
}
}
}
?>