sexverhalen

Gratis sexverhalen - Eroverhalen.com

iedere dag weer nieuwe geile sexverhalen

Nieuwe Sexverhalen

stuur ons uw zelfgeschreven sexverhaal stuur uw verhaal in

Duitse Jongens
Het kon toch geen toeval zijn? Dit was al de derde dag dat hij op hooguit tien pas afstand van haar kwam te liggen op het hete strand. Wat was er zo bijzonder aan het landschap achter haar, waar hij steeds naar leek te kijken. Of wendde hij snel zijn blik van haar af als ZIJ naar HEM keek? Hij was anders best een mooie knul. Of zei ze dat nog te zwak? Was hij eigenlijk niet een fantastisch mooie knul? Met een uitdagend gespierd
lijf, zongebruind, gehuld in een veel te kleine zwemslip. Waarom keek ze stiekem naar hem als hij op z'n rug ging liggen? Waarom keek ze dan vooral naar zijn bollende kruis? Naar de soms meer en soms minder nadrukkelijk afgetekende penis? En waarom volgde ze het wiegen van zijn gespierde billen als hij naar het water liep om met krachtige armslagen te gaan
zwemmen? Waarom voelde ze die huiveringwekkende rilling in haar schoot als hij terug kwam en zijn slip nog duidelijker tegen zijn kruis geplakt zat en ze precies de vorm van zijn jonge lul kon zien?
Geplaatst op 03 Mar 2011 door eroverhalen
Een stel geile meiden
Ellen en Petra stonden innig omarmd in de keuken. Ellen leunde met haar harde, stevige billen tegen de rand van het aanrecht. Petra perste zich tegen haar vriendin aan. Met haar vingers streelde zij de lange haren van Ellen, terwijl ze haar vurig zoende. "Jaa, heerlijk.." kreunde zij zacht. Haar verzuchting had te maken met het feit, dat Ellen met beide handen haar warme billen streelde. Zij had Petra's jurk van achteren omhoog geschoven, zodat haar zwarte slip vrijkwam. Toen had ze haar handen van bovenaf langs het elastiek geschoven, over Petra's blote billen, om haar vriendin van achteren intiem te strelen Inderdaad het was een heerlijk gevoel. "Je bent zo lief..en zo onstuimig..," glimlachte Ellen, die duidelijk de harde borsten van haar vriendin tegen zich aanvoelde. Petra's buik wreef verleidelijk langs haar schoot.
Geplaatst op 08 Feb 2011 door eroverhalen
De Trein
Ik haalde de laatste trein van Utrecht naar Eindhoven ruim op tijd . Ik had geen zin om gestoord te worden tijdens mijn reis en aangezien ik de conducteur bij de machinist zag instappen, liep ik over het perron naar de laatste coupe van het tweede treinstel. Onderwijl keek ik door de smerige treinvensters naar binnen. Bijna geen mens in de trein en naarmate ik verder naar achteren liep werd het leger en leger. Heerlijk rustig na zo’n zware dag. Stilte. Ik opende de deur van de treincoupé en nam plaats in mijn favoriete plek, meteen links achter de deur en een zogenaamde tweezitter. Ik zakte onderuit en legde mijn hoofd tegen het raam, sloot m’n ogen en genoot van de stilte die in een trein zo zeldzaam is. Ik dommelde een beetje weg, tot dat ik het sissen van de deur hoorde. Ik keek niet op, maar dacht: “verdomme, hopelijk niet zo’n halfgare student die zijn walkman zo meteen zo hard ze dat ik kan horen wat hij speelt !”. Maar verder besteedde ik er geen aandacht aan. De fluit van de conducteur klonk, immens ver weg. Deuren sisten en sloten en met wat gepiep en gekraak zette de trein zich in beweging.
Geplaatst op 29 Dec 2010 door eroverhalen
Mijn zusje
Dit verhaal speelt zich af in mijn jeugd. Ik was erg jong en scheelde slechts 4 jaar met mijn zusje. Wij woonden in een groot huis en hadden beiden een kamer op zolder. Ik had altijd al interesse gehad naar mijn zusje. Als zij lag te slapen sloop ik haar kamertje binnen en ging dan met mijn handen onder de dekens. Gleed over haar borstkas en voelde dan haar kleine tietjes die nog keihard waren haar tepeltjes reageerde op mijn aanraking en dan werd ze onrustig. Dan stopte ik en wachtte tot ze weer rustig sliep dan ging ik opnieuw met mijn handen onder de dekens maar stripte haar broekje nu van haar onderlijf en gooide die dan onder bed.
Geplaatst op 06 Dec 2010 door eroverhalen
siliconen borsten
Er is een prachtig zonnig weekend voorspeld, de hele Randstad bevolking trekt in de richting van het strand. Wij hadden zelf ook het plan om vandaag naar het naaktstrand te gaan maar als we 's morgens op de radio horen over die lange files wijzigen we het plan. "Laten we dan naar de duinen gaan" stel ik Rob voor, "daar is het vast minder druk". Dat valt dus ook tegen bemerken later want ook het duingebied blijkt het heel druk te zijn. We wandelen het vrije duingebied in op zoek naar een lekker plekje maar net als we een rustig duinpannetje gevonden hebben en ons uitkleden komen er mensen bij zitten. We lopen een eindje verderop maar net als we weer lekker liggen komt er een stel bij met heel luidruchtige kinderen." Dit wordt niks zo" zegt Rob geïrriteerd "kom op, we zoeken iets aan de andere kant van het prikkeldraad". Voorzichtig klimmen we over de versperring en verdwijnen het verboden gebied in. "Ik denk dat we nu op een stuk privé terrein zitten" zeg ik, "heerlijk rustig hier, geen kip te bekennen maar ik hoop dat er niet gecontroleerd wordt!" We lopen nog vijf minuten door zonder iemand tegen te komen en installeren ons dan in een mooi beschutte duinpan.
Geplaatst op 28 Oct 2010 door eroverhalen
Doorkijkbloesje
"Ik voel me toch wel erg naakt hoor met dat ding. Iedereen kijkt naar me
Ge." Mijn man drukte mijn arm en zei: "Stel je niet aan, op het strand lig je toch ook topless? Zullen we aan de overkant gaan lopen? Er liggen er nog genoeg op het strand, dan val je niet zo op." Met levensgevaar staken we over en keken naar de tientallen half blote dames, die tot het laatst van de Spaanse zon wilden genieten. Hoewel vooral de Spaanse mannen erg naar me keken vond ik 't nu niet zo erg meer en stapte vrolijk door naast m'n zeer aantrekkelijke man. Lekkere schat van me, dacht ik, kijk jij maar lekker naar al die mooie vrouwen hoor. Vanavond ga je toch met mij naar bed en kan ik profiteren van je opwinding. Plotseling zag ik haar, nog geen vijf meter van ons af. Misschien iets ouder dan ik, heel donkerbruin haar met een rossige gloed erover en met... mijn doorkijkbloesje. Ik gaf Ge een ruk aan z'n arm en hakkelde: "He... kijk daar 'ns...m'n doorkijkbloesje..." Op dat moment draaide ze zich half om en wou
doorlopen. Ze botste bijna tegen me op en bleef net zo verbaasd als ik
staan.
Geplaatst op 29 Sep 2010 door eroverhalen
Het Studentenhuis
Aahhhh..... de colleges waren weer afgelopen voor dit studiejaar en de pubers die nog ontgroend moesten worden waren nu al weer en masse op zoek naar een kamer. Doordat Henk-Jan zijn studie had afgerond en Katinka gestopt was met haar studie waren er in het studentenhuis waar ik woonde weer twee kamers vrij.

Sorry? Wie "ik" is? Okee, ik zal mij even voorstellen. Ik ben Mathijs, 22 jaar en derdejaars student technische bedrijfskunde aan de universiteit. Ik woon nu al weer twee jaar in dit studentenhuis en het bevalt mij prima. Het is er (voor een studentenhuis) redelijk rustig en het is ook helemaal niet duur. Privacy is er voldoende en dat was voor mij toentertijd een zwaarwegend punt. Ik ben bijzonder gesteld op privacy vanwege mijn 'hobby'. Nou ja, hobby.... Je kunt het ook een verslaving noemen. Ik heb een fetisj en dat betekent dat ik opgewonden raak van iets heel alledaags. In mijn geval zijn dat panty's. Ja zeker, ik weet dat het misschien een beetje vreemd klinkt, maar als ik een vrouw zie lopen kijk ik onwillekeurig naar haar enkels en benen om te zien of ze panty's draagt. En als ze dan panty's draagt weet ik dat ik te maken heb met een echte vrouw en dan voel ik mij de koning te rijk. Het hebben van een panty-fetisj betekent in mijn geval dat ik het niet alleen prettig vind om naar panty's te kijken, maar dat ik het ook prettig vind om ze zelf te dragen en zelfs om er aan te ruiken. De geur van een panty die door een mooie jonge geparfumeerde vrouw is gedragen is er eentje voor de goden. Op zo'n moment heb ik mijn hormonen gewoon niet meer allemaal onder controle.
Geplaatst op 15 Sep 2010 door eroverhalen
Juffrouw Katja
Katja verliet het huis via de keuken en zei tegen Ria: "Ik ga even naar de stad. Tegen het avondeten ben ik weer terug." "Goed juffrouw Katja," antwoordde het dienstmeisje op haar zangerige toon. Ria was een donkerblond, stevig gebouwd meisje van amper twintig. Ze was de dochter van de tuinman en bewoonde met haar ouders en jongere broer de dienstwoning aan het begin van de oprijlaan. Al vier jaar verzorgde ze, eerst samen met haar moeder maar sinds die niet sterk genoeg meer was alleen, de huishouding van de familie die het kleine landgoed bewoonde. De familie was overigens ook niet groot Katja's moeder was overleden en sindsdien huisde ze er alleen met d'r vader. Deze was meestal voor zaken weg, Katja had geen zin in een baan in de stad en verzorgde haar vaders administratie. Katja, lang en slank, liep met om haar hoofd zwierend goudblond haar naar de garage op het binnenplein van het landhuis. Ze droeg een helgroen jurkje van dunne, satijnachtige stof. Op het pleintje was Erwin, Ria's jongere broer, bezig in het bloemenperk.
Geplaatst op 02 Sep 2010 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 ?>