Na heel wat jaar geen aandacht besteed te hebben aan PHP ben ik er sinds kort weer mee bezig.
De onderstaande code zal dus ook allesbehalve perfect zijn maar ik hoop dat jullie de bedoeling ervan begrijpen.
Wat ik probeer te maken is een parser die een XHTML bestand opent en aan de hand van het ID van de tags, deze eventueel leegmaakt (tussen de tags) en de content uit de database er inzet.
Dit gaat in principe ook goed zoals ook te zien op http://85.17.199.46/~olcea/, er gaat alleen één ding fout en dat zijn tags zonder afsluiting (img, br enzo). Hij maakt dus van <img ... /> <img ...></img>. Nu zou ik dus een lijst van dit soort tags in een array kunnen zetten en vervolgens bij elke tag kijken of ie afgesloten moet worden of niet, maar dat vind ik nogal lomp, en ik zie eigenlijk geen andere oplossing hiervoor.
Iemand anders een idee?
De onderstaande code zal dus ook allesbehalve perfect zijn maar ik hoop dat jullie de bedoeling ervan begrijpen.
Wat ik probeer te maken is een parser die een XHTML bestand opent en aan de hand van het ID van de tags, deze eventueel leegmaakt (tussen de tags) en de content uit de database er inzet.
Dit gaat in principe ook goed zoals ook te zien op http://85.17.199.46/~olcea/, er gaat alleen één ding fout en dat zijn tags zonder afsluiting (img, br enzo). Hij maakt dus van <img ... /> <img ...></img>. Nu zou ik dus een lijst van dit soort tags in een array kunnen zetten en vervolgens bij elke tag kijken of ie afgesloten moet worden of niet, maar dat vind ik nogal lomp, en ik zie eigenlijk geen andere oplossing hiervoor.
Iemand anders een idee?
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
| include '../application/models/content.php'; class IndexController extends Zend_Controller_Action { public function indexAction() { global $tags, $result, $contentitems, $data, $parseddata; $content = new GetContent(); // haal de content die bij de pagina hoort op uit de database $result = $content->getAdapter() ->select() ->from('blocks', 'tid') ->joinUsing('content', 'cid') ->where('pid = ?', 'Home') ->query() ->fetchAll(); $xml_file = "templates/olcea1.0/index.html"; $counter = 0; function startTag($parser, $data, $attribs) { global $current_tag, $current_id, $dbcontent, $counter, $parseddata, $result, $replacetag, $tagcontent; $tagAttribs = FALSE; // level in de document tree + 1 $counter++; // als tag niet binnen de te vervangen content valt if (!$replacetag) { $parseddata .= "<" . strtolower($data); // als het aantal attributen in de tag geen 0 is if (count($attribs) != 0) { foreach ($attribs as $attrKey => $attrValue) { $tagAttribs .= " " . strtolower($attrKey) . "=\"" . $attrValue . "\""; } $parseddata .= $tagAttribs; } $parseddata .= ">"; // als het attribuut ID bestaat in de tag if (array_key_exists('ID', $attribs)) { $attribsId = $attribs['ID']; foreach ($result as $key => $value) { foreach ($result[$key] as $key2 => $value2) { // als het attribuut ID uit de tag overeenkomt met de ID van de content uit de database // plaats de content uit de database if ($value2 == $attribs['ID']) { $tagcontent = $result[$key]['content']; // zet bijbehorende content uit de database na de tag $parseddata .= $tagcontent; $newcontentadded = TRUE; $replacetag = $counter; } } } } } } function endTag($parser, $data) { global $current_tag, $current_id, $dbcontent, $counter, $parseddata, $replacetag, $newcontentadded, $tagcontent; if ($replacetag == $counter) { // eind tag bereikt $replacetag = FALSE; $newcontentadded = FALSE; } // als tag niet binnen de te vervangen content valt if (!$replacetag) { $parseddata .= "</" . strtolower($data) . ">"; } // level in de document tree -1 $counter--; } function tagContents($parser, $data) { global $parseddata, $replacetag; // als de content tussen de tags niet binnen de te vervangen content valt if (!$replacetag) { $parseddata .= $data; } } function docContents($parser, $data) { global $parseddata; $parseddata .= $data; } $xml_parser = xml_parser_create(); xml_set_element_handler($xml_parser, "startTag", "endTag"); xml_set_character_data_handler($xml_parser, "tagContents"); xml_set_default_handler($xml_parser, "docContents"); $fp = fopen($xml_file, "r") or die("Could not open file"); $data = fread($fp, filesize($xml_file)) or die("Could not read file"); if(!(xml_parse($xml_parser, $data, feof($fp)))) { die("Error on line " . xml_get_current_line_number($xml_parser)); } xml_parser_free($xml_parser); fclose($fp); $this->view->template = $parseddata; $this->render(); } } |