sexverhalen

Gratis sexverhalen - Eroverhalen.com

iedere dag weer nieuwe geile sexverhalen

Nieuwe Sexverhalen

stuur ons uw zelfgeschreven sexverhaal stuur uw verhaal in

Een Sneetje
Het was vroeg in het voorjaar en er stond een helder zonnetje aan de hemel. Dat kwam heel goed uit want Anja en ik hadden ons voorgenomen om dit weekend een beetje bij te bruinen op het naaktstrand in Scheveningen. Ik hoorde twee keer het scherpe toetertje van de scooter van Anja, keek naar buiten ,en ja hoor daar stond ze haar scooter op slot te doen.

Eenmaal boven gekomen zei ze :-jammer ,maar het is vandaag geen strand weer-. We waren inderdaad van plan om naar ons vaste stekje te gaan maar Anja zei dat dat er veel te veel wind was voor het strand. -Dan zullen we wat anders moeten verzinnen zei ik- en tegelijk dacht ik aan het naakt strandje bij De Vlietlanden. Ik was er nog niet zo lang geleden voorbij gereden en het leek me wel een leuk plekje omdat het met allerlei bosjes zo beschut lag. Anja kende het niet maar wilde het wel proberen; dus wij met z'n twee-n op haar scooter op weg naar Leidschendam.
Geplaatst op 30 Jul 2014 door eroverhalen
Treinavontuur met Kirsten
Ik woonde en studeerde in die tijd in Groningen. Het was een zaterdag en Koninginnedag. Het moet dus in 1983 gebeurd zijn. Ik stapte die ochtend in de trein voor een bezoek aan mijn ouders in Enschede. Het was zeer druk, waarschijnlijk gingen de meeste treinreizigers naar Amsterdam om daar Koninginnedag te vieren. Ik stapte pas vlak voor het vertrek de trein in, met als gevolg dat er bijna geen plaatsen meer vrij waren. Maar gelukkig vond ik nog een vrije plaats. Deel uitmakend van een groepje van vier, je kent ze wel die treinen.

Links naast mij zat een oudere man en schuin links tegenover mij een oudere vrouw. Waarschijnlijk een echtpaar. Recht tegenover mij zat een jong meisje van 18 of 19 jaar, misschien 20 maar dan houdt het wel op. Bruin haar, sproeten. Gekleed in een spijkerrokje welke tot halverwege haar bovenbenen reikte. Verder over haar spijkerrokje een zwarte blouse met daaronder een roze t-shirt. Haar benen waren gehuld in een lichtblauwe panty, iets lichter blauw dan haar rokje. Het meisje hield haar benen stijf over elkaar, ik kon nog net het allerbovenste deel van haar benen zien, waar haar lichtblauwe panty overging in donkerblauw. Echter haar kruis was net niet te zien. Helaas, want ik was heel benieuwd wat voor kleur onderbroek zij onder haar panty droeg.
Geplaatst op 15 Jul 2014 door eroverhalen
Getrouwde Daphne
Via een swingers contacten site kwam ik in contact met Daphne. Ze is een erg mooie getrouwde vrouw van 46, en heeft 1 dochter die het huis net uit is. Ze had op een verhaal gereageerd en zo begon er een spannende mail wisseling.

We stuurden elkaar vaak mail met dingen die we geil zouden vinden om te doen. En op een gegeven moment werden de mails geiler, en bedachten we wat wij met elkaar zouden doen. Tot het op een gegeven moment het er echt van kwam, we spraken een datum af. Erg spannend want ze blijft natuurlijk een vrouw die getrouwd is. Haar man was weg voor 2 dagen en nu wisten wij zeker dat we niet betrapt konden worden. Het duurde nog 4 weken voordat die dag er ook eindelijk was, dat ik naar Daphne ging. In de tussentijd werden de mails alleen maal geiler, we hadden elkaar in onze fantasie al erg vaak uitgekleed, gelikt en geneukt.
Geplaatst op 26 Jun 2014 door eroverhalen
Vakantie werk
Ik deed vakantiewerk via nationaal bekend uitzendbureau bij een pindafabriek. Op zich niet zo interessant, maar dat zou het wel worden.

Toen ik er een paar dagen had gewerkt kwamen er twee vrouwen van het uitzendbureau die ik nog niet eerder gezien had. En net zo als bij elk uitzendbureau waren het twee vrouwen die er piekfijn uitzagen. Alle twee droegen ze een rok met een blouse met een jasje erover. Ze stelden zich voor als Nathalie en Emily. Nathalie had lang, blond, krullend haar en had twee zeer grote borsten. Emily had kort, bruin haar met een stel stevige tieten en een ongelooflijk geile blik in d'r ogen. Ze wilden mij wat vragen stellen over het werk wat ik deed en of het niet te zwaar was.
Geplaatst op 18 Jun 2014 door eroverhalen
Fitness
Ik stapte in mijn auto en reed weg bij het kantoor! Het was weer vrijdag en ik had mezelf beloofd om lekker te genieten dit weekend! Ik had weer te veel gewerkt deze werk en was nodig toe aan een stukje ontspanning. Uit mijn werk reed ik dan ook regelrecht richting de sportschool! Daar kan ik echt van genieten, een uurtje zweten en flink fysiek bezig zijn en ondertussen gluren naar prachtige dames in strakke pakjes die de meest onmogelijk oefeningen doen. Het was denk ik een uur of 5 dat ik bij de sportschool aan kwam. Het was nog lekker rustig op het parkeerterrein en ik kon mijn auto bijna voor de deur neerzetten.

Eigenlijk altijd als ik binnen kom in die sportschool ga ik eerst voor het raam van de fitnesszaal staan om te kijken hoe druk het is en hoe het met de vrouwelijke medesporters gesteld is die dag. Helaas viel het tegen met de drukte en zag ik zo snel ook niet héél veel aantrekkelijk vrouwelijk schoon. Ik liep dus teleurgesteld richting de kleedkamer en trok mijn sportkleding aan. Een korte sportbroek en een donker T-shirt waarvan de mouwen zich nauw sloten om mijn bovenarmen. Ik besloot me vandaag met trainen te richting op mijn buikje, mijn sixpack begon enigszins te vervagen en die moest weer bijgewerkt worden. Het zou alweer snel mooi weer zijn en dan moest ik op het strand er natuurlijk wel perfect bijlopen. Ik kan dan echt genieten van alle vrouwen-ogen die over mijn buikje glijden, heerlijk!
Geplaatst op 02 Jun 2014 door eroverhalen
Hockey trutjes
De wedstrijd zat erop en de dames van Pinoke hadden het landelijk kampioenschap binnengehaald met een eclatante zege.
Buiten zinnen van vreugde stroomden de vrouwen de kleedkamer in,
luid joelend en gillend, de trofee in de lucht meedragend.
Na minutenlang luidruchtig gefeest, begonnen de vrouwen de douche ruimte in te stromen. Sommigen trokken hun hockey tenues uit, anderen kletsten met elkaar en doken gewoon onder de douche met hun tenues aan.

Het water stroomde over de bezwete lichamen van de kakelende kampioenen. Tepels werden stijf en van de nog geklede dames doorweekten de shirts tot hun tieten duidelijk zichtbaar werden door de doorweekte shirts.
Hoe het begin en hoe het zich ontwikkelde was niet duidelijk, maar langzaam maar zeker raakten sommige van de dames opgehitst,
mogelijk door een combinatie van de gedronken champagne en de
feestvreugde.

De donkerharige Juliette was verwikkeld in een hevig en heet
tonggevecht met de blonde Joanneke. De blondine kneep in Juliette’s tieten terwijl het speeksel rijkelijk vloeide, en Juliette twee vingers in Joanneke’s kut propte.
Geplaatst op 27 May 2014 door eroverhalen
De Sauna
Hoewel het rustieke dorpje V. best een eindje rijden was, besloten Linda en ik toch daar naar de sauna te gaan. Zijn de meeste sauna's op vrijdagavond overvol, die in V. is meestal een oase van rust. En de buitensauna is een belevenis op zich, maar daarover zo dadelijk meer. Even voor de duidelijkheid, ik ga niet naar de sauna om naar de meiden te gluren.

Maar goed, ik heb mijn ogen natuurlijk niet in mijn zak (suggestieve plaats trouwens, in dit verband). We hadden ons nauwelijks in onze badjassen gehesen, of een prachtig jong ding van zo'n jaar of 15 viel me al op. Lang donkerblond haar tot op haar kont, superslank, kleine ronde borstjes met mooie felle tepeltjes en een magnifieke bos donker schaamhaar... daar kon je moeilijk om heen kijken. Ze was met de hele familie zo te zien en het was waarschijnlijk haar broer die Linda meteen opviel.

'Heb je die lul gezien...' fluisterde Linda in mijn oor, 'allemachtig, wat een gevaarte!' Nou nee, die lul was me dus nog niet opgevallen, druk als ik het had met dat heerlijke lijfje van die jonge meid te bekijken. Even later kwam dat joch echter voorbij en ik begreep meteen wat Linda bedoelde. Allemachtig, wat een paal. Uit een dikke, donkere bos schaamhaar stak een forse, en toch nog slappe, pik naar voren. 'Hou me vast,' hijgde Linda weer in m'n oor, 'ik grijp um, jezus zeg, hoe ziet dat ding er wel niet uit als-ie hard is.' Ik kneep Linda onopvallend in haar billen en wist zeker dat ze stond te druipen. Maar midden in zo'n sauna is het niet een echt goede plek om dat te controleren.
Geplaatst op 02 Mar 2014 door eroverhalen
Perverse sex
Na maanden van gezeur van mijn vrouw en drie kinderen, was ik het zat. Zij wilden zo graag een hond, en het liefst een Deense dog. Toe maar groter is er niet te vinden. Hij zal me arm vreten, maar geen enkel door mij aangedragen argument werd geaccepteerd. Ten einde (om van het gezeur af te zijn) gaf ik toe. En na een zoektocht van enkele weken kon ik bij een man in Utrecht vrij goedkoop een dergelijk merk voor een redelijke prijs overnemen. De man’s vrouw was kort geleden overleden vertelde hij me en hij kon i.v.m. zijn werkzaamheden niet voor de hond zorgen.

Hij overtuigde mij, dat het een heel lief en aanhankelijk beest was, en zijn overleden vrouw was helemaal gek op de hond, die luisterde naar de naam Ukkie. Thuis aangekomen kon het niet meer stuk. En na enige weken bleek het inderdaad een schat van een hond te zijn.
Geplaatst op 04 Dec 2013 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 ?>