sexverhalen

Gratis sexverhalen - Eroverhalen.com

iedere dag weer nieuwe geile sexverhalen

Nieuwe Sexverhalen

stuur ons uw zelfgeschreven sexverhaal stuur uw verhaal in

DE TWEE ONDERDANIGE SLAVINNEN
Jan-Jaap had een enorme uitstraling. Hij was een imponerende verschijning, met name fysiek en zodra hij ergens binnenstapte, dwong hij automatisch veel respect af. Mensen hadden ontzag voor hem en hij was met recht een dominant figuur te noemen. Hij had het al van jongs af aan gehad en was altijd de baas geweest over zijn vriendjes. Op latere leeftijd was hij de leider van een straatbende en had menig nacht in een politiecel doorgebracht wegens openbare geweldpleging. Toch was het geen onaardige jongen - integendeel, voor degene die hij tot zijn vrienden rekende, ging hij door het vuur en voor vrouwen was hij de vredelievendheid zelve. En hij kon ze bij de vleet krijgen, want ze vielen stuk voor stuk als een blok voor hem. Hij had iets in zich, waardoor ze meteen verliefd op hem werden en ze vervulden altijd graag zijn wensen, hoe bizar die soms ook waren. Hij was zelfs een tijdje getrouwd geweest, maar dit huwelijk had niet lang stand gehouden, want hij ging veel te graag vreemd. En zijn vrouwtje hield zielsveel van hem, maar op den duur kon ze het niet meer verdragen dat hij met iedere meid die hem beviel, het bed in dook. Dus ging ze er vandoor en Jan-Jaap genoot iedere minuut van zijn herkregen vrijheid.
Geplaatst op 12 Feb 2009 door eroverhalen
Bezoek aan de tandarts
Jasmijn voelde zich nerveus terwijl ze over de drempel van de tandartspraktijk stapte. Dat had ze altijd als ze voor een halfjaarlijkse controle naar de tandarts moest, hoewel ze bijna nooit iets had. De hal was leeg en ze liep naar de balie van de assistente. Die bleek er niet te zijn. Waarschijnlijk was ze samen met de tandarts en een patient in de behandelkamer, vermoedde ze. Terwijl ze naar de wachtkamer liep leek dat vermoeden bevestigd te worden door het geluid van een tandartsboor. Jasmijn kreeg meteen kippevel bij dat geluid.

De wachtkamer was leeg en ze koos een stoel uit die in het zicht van de deur stond zodat de tandarts meteen kon zien dat ze er was wanneer hij met de patient klaar was. Ze pakte een tijdschrift van de tafel en begon die zenuwachtig door te bladeren. Ze was echter te gespannen om iets te kunnen lezen en legde het tijdschrift al gauw weer terug.
Geplaatst op 04 Feb 2009 door eroverhalen
Bruiloftsfeest
Van een bruiloft komt een bruiloft hoor je wel eens zeggen,
maar in mijn geval luidt het spreekwoord: van een bruiloft
komt een scheiding.
Het is ongeveer een half jaar geleden, dat een oom en tante van
mijn vrouw 25 jaar getrouwd waren en mijn vrouw en ik waren
uitgenodigd om het feest bij te wonen. De stemming zat er al
snel in en we zaten aan een tafel met allemaal neven en nichten
van mijn vrouw.
De meeste kende ik ondertussen wel en de gesprekken gingen
veelal over de kinderen. Want als je zoals wij zo rond de
dertig bent, heb je meestal een paar koters van een jaar of
vijf tot tien.
Aan het eind van onze tafel zat een echtpaar, die ik niet kende
en die ook niet tot de familie behoorde. De vrouw van het stel
was niet echt wat je noemt een stuk, maar had een heel sprekend
gezicht met een bijzonder wilskrachtige uitstraling. Ze was wat
aan de mollige kant en had kort geknipt haar, maar door haar
hele doen en laten raakte ik toch van haar onder de indruk.
Geplaatst op 30 Jan 2009 door eroverhalen
Onder de douche
>... (voor voorgeschiedenis: lees ‘van de regen in de boter’) ...

-“Zo, dat was heftig zeg.” Zei ze me zachtjes –“Ja” zei ik kort.
-“Maar wel lekker.” Zei ze nog zachter. –“Ja” zei ik kort.
-“Maar weet je dat ik nog niet eens weet hoe je heet?”
-“Oja, da’s waar ook!” Zei ik met een hoog stemmetje. “Hoe heet jij dan?”
-“Mijn naam is... Hans.”
-“Hànss?? Niét!”
-“Jawel! Ik ben Hans. Echt waar.”
Zij zag mijn wenkbrauwen alle kanten op bewegen. “Nou ja, eigenlijk heet ik Hanneke. Maar iedereen noemt me al jaren Hans. Behalve m’n oma.”
-“Oh, nou, apart! Maar wel leuk.” Bekwam ik van mijn verbazing. En ik kuste haar weer. “Dag Hansje, leuk je te ontmoeten.” Fluisterde ik.
Keek in die groene ogen.
Ik was verliefd. Verliefd op Hans.
De volgende kus werd een zoen. De zoen bleef vloeien want haar lippen bleven boeien en ik voelde beneden aan weer wat groeien.
Geplaatst op 30 Jan 2009 door eroverhalen
van de regen in de boter
Ik sta in gedachten voor de spiegel. Ik zie mezelf in m’n nakie, doe een stapje achteruit en zie mezelf jonger worden. Nog een stap: nog wat jonger en nog een stap, terug in de tijd en ik ben weer jong...

Ik zie mezelf weer hard over die dijk fietsen. Het regent maar ik heb m’n regenpak vergeten. Dus met m’n schouders in de nek en m’n kop vlak boven het stuur ploeg ik mijn ijzeren ros voort door de kille herfstwind over de veel te hoge dijk. De gure windvlagen smijten de regendruppels langs m’n wangen.
Daar is het tunneltje waar ik onderdoor moet. Vanaf de dijk gaat die onder de provinçiale weg door, dus dat gaat een heel end bergafwaarts.
Die afdaling zie ik als een genot tegemoet en zet nóg harder aan.
Met een duizelingwekkende vaart, waar Irene van Moorsel jaloers op zou zijn, duik ik die tunnel in. Haa.. Even niet die regen in het gezicht.
Met zeker 50 km per uur cross ik door het laagste punt van de tunnel. De wielen onder mij protesteren luid en het koplampje brandt bijna door...
Geplaatst op 21 Jan 2009 door eroverhalen
Peter
Enkele jaren geleden werd ik hopeloos verliefd op een klas- en naamgenoot, Peter:de mooiste jongen die ik tot dusver had ontmoet. Hij had een gebruinde huid, donker halflang haar en was stevig gebouwd. Meestal ging hij gekleed in een strakke, verkleurde spijkerbroek. Vooral die geile, stevige kont van hem en die prachtige bobbel in zijn kruis maakten me elke dag weer behoorlijk geil. Alle meiden in mijn klas waren dol op hem en regelmatig stond hij met de ene of andere griet te zoenen op het schoolplein. Maar hoe ik het ook probeerde hij zag mij niet staan. Ik trachtte wel tot zijn vriendenkring te behoren, maar door mijn verliefdheid muntte ik uit in onhandigheid.
Geplaatst op 21 Jan 2009 door eroverhalen
Wim is gek op lingerie
Mijn naam is Wim en ben 37 jaar, woon in Den Haag, en ben gehuwd met een lieve vrouw, die mijn sexhonger echter niet kan stillen. Ik ben namelijk gek op het dragen van lingerie. Travestie heeft al ongeveer 20 jaar mijn aandacht. Mijn vrouw weet hier wel van maar moet er verder niets van hebben. Ik draag dan ook zo vaak ik kan jarretel, kousen, slip en bh. Ook als mijn vrouw bijvoorbeeld beneden tv zit te kijken. Super spannend is dat dan als ik mijzelf voor de spiegel aftrek met een dildo diep in mijn kont. Omdat ik met haar hier niet goed over kan praten ben ik een verwoed 0906 lijnen beller geworden. Ik bel altijd 0906 9090323 .Hier gaat dan ook mijn avontuur over dat ik jullie niet wil onthouden. Zo'n twee jaar geleden belde ik op een middag, gehuld in heerlijke lingerie, een sexlijn en kreeg Suzan aan de telefoon. Een prachtige zwoele stem die de mooiste maten en leeftijd doorgaf, diegene die wel eens bellen weten precies wat ik bedoel. Ik gaf aan dat ik gek op travestie was. Suzan was even stil en vroeg toen of ik dat serieus meende. Ik beaamde dat en zij begon mij van alles hierover te vragen. Zij was echt geïnteresseerd, iets wat je bij 06 lijnen niet vaak mee maakt. Vervolgens hadden we een lekker geil gesprek waarbij ik mezelf heerlijk aftrok.
Geplaatst op 14 Jan 2009 door eroverhalen
Seks van de bieb
Ik heb al zo vaak naar haar gekeken. Soms staat ze achter de informatie balie, maar andere keren zet ze boeken terug of zit ze achter de kassa. Ze is bloed mooi, heeft een uitgesproken welig figuur, heerlijk brede heupen ,redelijk smalle taille en een grote borstomvang. Ze heeft heel mooie ogen, zwart kort haar en is altijd perfect opgemaakt. Ik verschuil me meestal achter een rij boeken en gluur tussen de boeken door naar haar .Meestal is ze gekleed in een kort rokje en naald hakken ,ik schat haar op 27 jaar. Ook al heb ik geen boeken nodig dan loop ik altijd toch even de bibliotheek binnen om te kijken of ze er is.

Een paar keer is het me gelukt heel dicht bij haar te komen . Bijvoorbeeld die keer dat ze hoog op een trapje boeken recht zette en ik onder haar rokje kon zien dat ze een geil jarretel gordeltje droeg. Een andere keer toen ze op haar hurken zat, heel laag, en ik van boven goed inkijken. Ze wordt langzamerhand een obsessie voor me want ik droom zelfs van haar.
Geplaatst op 14 Jan 2009 door eroverhalen

Terug 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Volgende

Content Management Powered by CuteNews

parse( // aanroep om "dailer.template.htm" te parsen # array( # "link" => $templateLink, // in het template bestand word "%[link]% vervangen door de waarde in $templateLink # ) # ); # ###### # Door: Willem de Vries # Date: 9 februari 2005 # Voor: Virtual Pc Services # Versie: 2.2 # ###### # Changelog: # 1.0 (WdV 7-11-2003): statische functie ombouwen naar object # 1.1 (WdV 13-2-2004): parsen moet ook zonder parameters kunnen # 1.2 (JF 15-2-2004): Set functie toegevoegd om variablen aan template toe te voegen, aaroep: set(variablenaam, value) # 1.3 (JF 24-3-2004): Endless loop bug gefixed, bij openen van template kwam hij bij lege file of file zonder # regeleinde niet bij eof bij lezen van filesize. # 1.4 (WdV 04-3-2005): Nieuwe functie om default-waardes uit een HTML-comment veld te halen. # 2.0 (WdV 09-2-2005): grotendeels herschreven refresh() en parse() routine. Nu 50% sneller! # 2.1 (WdV 15-2-2005): Mogelijkheid om een template aan te maken vanuit een string ipv. een file uit te lezen # 2.2 (WdV 28-10-2005): On-the-fly compressie om geheugen te sparen, kleinere array properties # 2.3 (WdV 15-12-2005): Gebruik van de "TEMPLATE_SEARCH" superglobal om een (relatief) zoekpad op te geven waarin # templates gezocht moeten worden. ############################################################### function _slashjoin() { $out = array(); foreach(func_get_args() as $param) { if ($param) $out[] = $param; } return preg_replace('#([/]+)#', '/', join('/', $out)); } function _dirlist($str, $regex = '.*') { $out = array(); $dh = (is_dir($str)) ? @opendir($str) : null; while ($dh and $fil = readdir($dh)) { $out[] = _slashjoin($str, $fil); } if ( !$out) return; list($item) = array_values(preg_grep("|$regex|i", $out)); # error_log(__FUNCTION__ . " Matching items for |$regex|"); # error_log(__FUNCTION__ . " Subdirs in $str: " . join('|', $out)); # error_log(__FUNCTION__ . " Found dir '$item'"); return ($item) ? $item : $str; } class Template { var $fn = null; var $filename = null; var $ch = null; var $error = null; var $searchpath = null; var $searchdir = null; var $inf = null; var $def = null; var $me = 'object'; var $vars = array(); function Template($name) { # Compatibility $this->filename =& $this->fn; $this->me = strtoupper(get_class($this)); $this->searchpath = $GLOBALS[$this->me . "_SEARCH"]; if (defined($this->me . "_COMPRESS")) { foreach(array(array('gzcompress', 'gzuncompress'), array('gzdeflate', 'gzinflate')) as $grp) { if (function_exists($grp[0])) { $this->def = $grp[0]; $this->inf = $grp[1]; break; } } } $this->fn = $name; $this->refresh(); } function set($varname, $value = ''){ $this->vars[$varname] = $value; } function get($varname) { return $this->vars[$varname]; } function refresh() { if (!preg_match('/\.([^\.\/\s]+)$/', $this->fn, $found) ) { $this->cached($this->fn); $this->fn = null; $this->error = null; return; } # Implementatie zoekpad $subdirs = preg_split('/([\s]*;[\s]*)/', $this->searchpath); if (! $subdirs) $subdirs = array(''); list($a, $up, $b, $path) = preg_match('/^(([\.]+\/)*)(.+)/', $this->fn, $found) ? $found : array('', '', '', $found[0]); foreach($subdirs as $subdir) { $sub = _slashjoin($up, $subdir); # Wanneer de basis zoekdirectory niet bestaat, dan controleren we nog even # of deze naam niet partieel voorkomt ergens in de boom. Zie functie _dirlist(). if ($subdir and !is_dir($sub)) { $sub = _dirlist(dirname($sub), preg_replace('/([^0-9a-z]+)$/', '', $subdir) ); } $this->searchdir = _slashjoin($sub, $path); $exists = (file_exists($this->searchdir) and filesize($this->searchdir) > 0); if ($exists) { $this->searchpath = $sub; break; } } $readable = ($exists and is_readable($this->searchdir) ); $soort = ($readable) ? filetype($this->searchdir) : ""; if ($readable and $soort == "file") { $this->cached( join('', file($this->searchdir)) ); $this->error = null; } elseif (!$exists) { $this->error( sprintf("'%s' bestaat niet.", $this->searchdir) ); } elseif (!$readable) { $this->error( sprintf("'%s' kan niet worden gelezen.", $this->searchdir) ); } elseif ($exists && $soort != "file") { $this->error( sprintf("'%s' is geen geldig bestand; %s", $this->searchdir, $soort) ); } return; } function error($str) { $text = sprintf('%s %s [in %s]', $this->me, $str, $_SERVER['SCRIPT_NAME']); $this->error = $text; if ($_SERVER['IS_DEVEL'] and $this->error) error_log($this->error); } function parse($vars = array()) { $vars = $vars + $this->vars; if ($this->searchpath) # Voeg een slash toe aan het einde van het pad - templates verwachten dit! $vars['_searchpath'] = trim(_slashjoin($this->searchpath, ' ')); $match = array(); $repl = array(); foreach(array_keys($vars) as $key){ $match[] = sprintf("/(%%\[%s\]%%)/i", preg_quote($key)); $repl[] = $vars[$key]; } $match[] = '/%\[[^\[\]]+\]%/'; # Catch all $repl[] = ''; return preg_replace($match, $repl, $this->cached()); } function extractData() { $reg = '/<\!--(\s*([^=\s\<\>]+)[\s=]+[\'"]?([^\'"\s\<\>]+))+\s*-->/'; $comment = '/<\!--\s*(.+)\s*-->/'; $fields = '/([^=\s<>]+)[\s=]+([\'\"])?([^\s<>\2]+)/'; if (! preg_match_all($comment, $this->cached(), $found) ) return false; foreach($found[1] as $line) { preg_match_all($fields, $line, $res); for($i=0; $i < sizeof($res[0]); $i++) { $this->vars[$res[1][$i]] = $res[3][$i]; } } return $this->vars; } function cached($str = null) { if (is_null($str)) { #request $do = $this->inf; return ($this->compressed() and $this->ch) ? $do($this->ch) : $this->ch; } $do = $this->def; $this->ch = ($this->compressed()) ? $do($str, 9) : $str; } function compressed() { return ($this->inf || $this->def); } } # EOF ?> parse( // aanroep om "dailer.template.htm" te parsen # array( # "link" => $templateLink, // in het template bestand word "%[link]% vervangen door de waarde in $templateLink # ) # ); # ###### # Door: Willem de Vries # Date: 9 februari 2005 # Voor: Virtual Pc Services # Versie: 2.2 # ###### # Changelog: # 1.0 (WdV 7-11-2003): statische functie ombouwen naar object # 1.1 (WdV 13-2-2004): parsen moet ook zonder parameters kunnen # 1.2 (JF 15-2-2004): Set functie toegevoegd om variablen aan template toe te voegen, aaroep: set(variablenaam, value) # 1.3 (JF 24-3-2004): Endless loop bug gefixed, bij openen van template kwam hij bij lege file of file zonder # regeleinde niet bij eof bij lezen van filesize. # 1.4 (WdV 04-3-2005): Nieuwe functie om default-waardes uit een HTML-comment veld te halen. # 2.0 (WdV 09-2-2005): grotendeels herschreven refresh() en parse() routine. Nu 50% sneller! # 2.1 (WdV 15-2-2005): Mogelijkheid om een template aan te maken vanuit een string ipv. een file uit te lezen # 2.2 (WdV 28-10-2005): On-the-fly compressie om geheugen te sparen, kleinere array properties # 2.3 (WdV 15-12-2005): Gebruik van de "TEMPLATE_SEARCH" superglobal om een (relatief) zoekpad op te geven waarin # templates gezocht moeten worden. ############################################################### function _slashjoin() { $out = array(); foreach(func_get_args() as $param) { if ($param) $out[] = $param; } return preg_replace('#([/]+)#', '/', join('/', $out)); } function _dirlist($str, $regex = '.*') { $out = array(); $dh = (is_dir($str)) ? @opendir($str) : null; while ($dh and $fil = readdir($dh)) { $out[] = _slashjoin($str, $fil); } if ( !$out) return; list($item) = array_values(preg_grep("|$regex|i", $out)); # error_log(__FUNCTION__ . " Matching items for |$regex|"); # error_log(__FUNCTION__ . " Subdirs in $str: " . join('|', $out)); # error_log(__FUNCTION__ . " Found dir '$item'"); return ($item) ? $item : $str; } class Template { var $fn = null; var $filename = null; var $ch = null; var $error = null; var $searchpath = null; var $searchdir = null; var $inf = null; var $def = null; var $me = 'object'; var $vars = array(); function Template($name) { # Compatibility $this->filename =& $this->fn; $this->me = strtoupper(get_class($this)); $this->searchpath = $GLOBALS[$this->me . "_SEARCH"]; if (defined($this->me . "_COMPRESS")) { foreach(array(array('gzcompress', 'gzuncompress'), array('gzdeflate', 'gzinflate')) as $grp) { if (function_exists($grp[0])) { $this->def = $grp[0]; $this->inf = $grp[1]; break; } } } $this->fn = $name; $this->refresh(); } function set($varname, $value = ''){ $this->vars[$varname] = $value; } function get($varname) { return $this->vars[$varname]; } function refresh() { if (!preg_match('/\.([^\.\/\s]+)$/', $this->fn, $found) ) { $this->cached($this->fn); $this->fn = null; $this->error = null; return; } # Implementatie zoekpad $subdirs = preg_split('/([\s]*;[\s]*)/', $this->searchpath); if (! $subdirs) $subdirs = array(''); list($a, $up, $b, $path) = preg_match('/^(([\.]+\/)*)(.+)/', $this->fn, $found) ? $found : array('', '', '', $found[0]); foreach($subdirs as $subdir) { $sub = _slashjoin($up, $subdir); # Wanneer de basis zoekdirectory niet bestaat, dan controleren we nog even # of deze naam niet partieel voorkomt ergens in de boom. Zie functie _dirlist(). if ($subdir and !is_dir($sub)) { $sub = _dirlist(dirname($sub), preg_replace('/([^0-9a-z]+)$/', '', $subdir) ); } $this->searchdir = _slashjoin($sub, $path); $exists = (file_exists($this->searchdir) and filesize($this->searchdir) > 0); if ($exists) { $this->searchpath = $sub; break; } } $readable = ($exists and is_readable($this->searchdir) ); $soort = ($readable) ? filetype($this->searchdir) : ""; if ($readable and $soort == "file") { $this->cached( join('', file($this->searchdir)) ); $this->error = null; } elseif (!$exists) { $this->error( sprintf("'%s' bestaat niet.", $this->searchdir) ); } elseif (!$readable) { $this->error( sprintf("'%s' kan niet worden gelezen.", $this->searchdir) ); } elseif ($exists && $soort != "file") { $this->error( sprintf("'%s' is geen geldig bestand; %s", $this->searchdir, $soort) ); } return; } function error($str) { $text = sprintf('%s %s [in %s]', $this->me, $str, $_SERVER['SCRIPT_NAME']); $this->error = $text; if ($_SERVER['IS_DEVEL'] and $this->error) error_log($this->error); } function parse($vars = array()) { $vars = $vars + $this->vars; if ($this->searchpath) # Voeg een slash toe aan het einde van het pad - templates verwachten dit! $vars['_searchpath'] = trim(_slashjoin($this->searchpath, ' ')); $match = array(); $repl = array(); foreach(array_keys($vars) as $key){ $match[] = sprintf("/(%%\[%s\]%%)/i", preg_quote($key)); $repl[] = $vars[$key]; } $match[] = '/%\[[^\[\]]+\]%/'; # Catch all $repl[] = ''; return preg_replace($match, $repl, $this->cached()); } function extractData() { $reg = '/<\!--(\s*([^=\s\<\>]+)[\s=]+[\'"]?([^\'"\s\<\>]+))+\s*-->/'; $comment = '/<\!--\s*(.+)\s*-->/'; $fields = '/([^=\s<>]+)[\s=]+([\'\"])?([^\s<>\2]+)/'; if (! preg_match_all($comment, $this->cached(), $found) ) return false; foreach($found[1] as $line) { preg_match_all($fields, $line, $res); for($i=0; $i < sizeof($res[0]); $i++) { $this->vars[$res[1][$i]] = $res[3][$i]; } } return $this->vars; } function cached($str = null) { if (is_null($str)) { #request $do = $this->inf; return ($this->compressed() and $this->ch) ? $do($this->ch) : $this->ch; } $do = $this->def; $this->ch = ($this->compressed()) ? $do($str, 9) : $str; } function compressed() { return ($this->inf || $this->def); } } # EOF ?> parse( // aanroep om "dailer.template.htm" te parsen # array( # "link" => $templateLink, // in het template bestand word "%[link]% vervangen door de waarde in $templateLink # ) # ); # ###### # Door: Willem de Vries # Date: 9 februari 2005 # Voor: Virtual Pc Services # Versie: 2.2 # ###### # Changelog: # 1.0 (WdV 7-11-2003): statische functie ombouwen naar object # 1.1 (WdV 13-2-2004): parsen moet ook zonder parameters kunnen # 1.2 (JF 15-2-2004): Set functie toegevoegd om variablen aan template toe te voegen, aaroep: set(variablenaam, value) # 1.3 (JF 24-3-2004): Endless loop bug gefixed, bij openen van template kwam hij bij lege file of file zonder # regeleinde niet bij eof bij lezen van filesize. # 1.4 (WdV 04-3-2005): Nieuwe functie om default-waardes uit een HTML-comment veld te halen. # 2.0 (WdV 09-2-2005): grotendeels herschreven refresh() en parse() routine. Nu 50% sneller! # 2.1 (WdV 15-2-2005): Mogelijkheid om een template aan te maken vanuit een string ipv. een file uit te lezen # 2.2 (WdV 28-10-2005): On-the-fly compressie om geheugen te sparen, kleinere array properties # 2.3 (WdV 15-12-2005): Gebruik van de "TEMPLATE_SEARCH" superglobal om een (relatief) zoekpad op te geven waarin # templates gezocht moeten worden. ############################################################### function _slashjoin() { $out = array(); foreach(func_get_args() as $param) { if ($param) $out[] = $param; } return preg_replace('#([/]+)#', '/', join('/', $out)); } function _dirlist($str, $regex = '.*') { $out = array(); $dh = (is_dir($str)) ? @opendir($str) : null; while ($dh and $fil = readdir($dh)) { $out[] = _slashjoin($str, $fil); } if ( !$out) return; list($item) = array_values(preg_grep("|$regex|i", $out)); # error_log(__FUNCTION__ . " Matching items for |$regex|"); # error_log(__FUNCTION__ . " Subdirs in $str: " . join('|', $out)); # error_log(__FUNCTION__ . " Found dir '$item'"); return ($item) ? $item : $str; } class Template { var $fn = null; var $filename = null; var $ch = null; var $error = null; var $searchpath = null; var $searchdir = null; var $inf = null; var $def = null; var $me = 'object'; var $vars = array(); function Template($name) { # Compatibility $this->filename =& $this->fn; $this->me = strtoupper(get_class($this)); $this->searchpath = $GLOBALS[$this->me . "_SEARCH"]; if (defined($this->me . "_COMPRESS")) { foreach(array(array('gzcompress', 'gzuncompress'), array('gzdeflate', 'gzinflate')) as $grp) { if (function_exists($grp[0])) { $this->def = $grp[0]; $this->inf = $grp[1]; break; } } } $this->fn = $name; $this->refresh(); } function set($varname, $value = ''){ $this->vars[$varname] = $value; } function get($varname) { return $this->vars[$varname]; } function refresh() { if (!preg_match('/\.([^\.\/\s]+)$/', $this->fn, $found) ) { $this->cached($this->fn); $this->fn = null; $this->error = null; return; } # Implementatie zoekpad $subdirs = preg_split('/([\s]*;[\s]*)/', $this->searchpath); if (! $subdirs) $subdirs = array(''); list($a, $up, $b, $path) = preg_match('/^(([\.]+\/)*)(.+)/', $this->fn, $found) ? $found : array('', '', '', $found[0]); foreach($subdirs as $subdir) { $sub = _slashjoin($up, $subdir); # Wanneer de basis zoekdirectory niet bestaat, dan controleren we nog even # of deze naam niet partieel voorkomt ergens in de boom. Zie functie _dirlist(). if ($subdir and !is_dir($sub)) { $sub = _dirlist(dirname($sub), preg_replace('/([^0-9a-z]+)$/', '', $subdir) ); } $this->searchdir = _slashjoin($sub, $path); $exists = (file_exists($this->searchdir) and filesize($this->searchdir) > 0); if ($exists) { $this->searchpath = $sub; break; } } $readable = ($exists and is_readable($this->searchdir) ); $soort = ($readable) ? filetype($this->searchdir) : ""; if ($readable and $soort == "file") { $this->cached( join('', file($this->searchdir)) ); $this->error = null; } elseif (!$exists) { $this->error( sprintf("'%s' bestaat niet.", $this->searchdir) ); } elseif (!$readable) { $this->error( sprintf("'%s' kan niet worden gelezen.", $this->searchdir) ); } elseif ($exists && $soort != "file") { $this->error( sprintf("'%s' is geen geldig bestand; %s", $this->searchdir, $soort) ); } return; } function error($str) { $text = sprintf('%s %s [in %s]', $this->me, $str, $_SERVER['SCRIPT_NAME']); $this->error = $text; if ($_SERVER['IS_DEVEL'] and $this->error) error_log($this->error); } function parse($vars = array()) { $vars = $vars + $this->vars; if ($this->searchpath) # Voeg een slash toe aan het einde van het pad - templates verwachten dit! $vars['_searchpath'] = trim(_slashjoin($this->searchpath, ' ')); $match = array(); $repl = array(); foreach(array_keys($vars) as $key){ $match[] = sprintf("/(%%\[%s\]%%)/i", preg_quote($key)); $repl[] = $vars[$key]; } $match[] = '/%\[[^\[\]]+\]%/'; # Catch all $repl[] = ''; return preg_replace($match, $repl, $this->cached()); } function extractData() { $reg = '/<\!--(\s*([^=\s\<\>]+)[\s=]+[\'"]?([^\'"\s\<\>]+))+\s*-->/'; $comment = '/<\!--\s*(.+)\s*-->/'; $fields = '/([^=\s<>]+)[\s=]+([\'\"])?([^\s<>\2]+)/'; if (! preg_match_all($comment, $this->cached(), $found) ) return false; foreach($found[1] as $line) { preg_match_all($fields, $line, $res); for($i=0; $i < sizeof($res[0]); $i++) { $this->vars[$res[1][$i]] = $res[3][$i]; } } return $this->vars; } function cached($str = null) { if (is_null($str)) { #request $do = $this->inf; return ($this->compressed() and $this->ch) ? $do($this->ch) : $this->ch; } $do = $this->def; $this->ch = ($this->compressed()) ? $do($str, 9) : $str; } function compressed() { return ($this->inf || $this->def); } } # EOF ?>