sexverhalen

Gratis sexverhalen - Eroverhalen.com

iedere dag weer nieuwe geile sexverhalen

Nieuwe Sexverhalen

stuur ons uw zelfgeschreven sexverhaal stuur uw verhaal in

Een waar gebeurd verhaal
De buren links waren ook op
vakantie. Rechts woonde een echtpaar van ver boven de zeventig Ze waren
allebei half doof dus daar verwachtte ik geen aanspraak. Verwonderd draaide
ik dan ook mijn hoofd om toen een welluidende zachte stem zei: “Ook
goeiemorgen.” Een kleine slanke schoonheid, gekleed in een superkort
nachthemd liet haar ogen over mijn lichaam dwalen en bloosde licht toen ik
haar door dringend aanstaarde. Ze moest wel merken, dat ik haar met m'n ogen
uitkleedde, zo opvallend keek ik. “0, hallo”, stamelde ik, “eh ... ik had je
niet verwacht ... hier wonen toch oude mensen?” Ze lachte innemend. “Klopt,
ik ben de kleindochter, logeer hier sinds gisteravond avond. Ze slapen nog,
de ouwetjes.” “Mooi uitzicht he?” Ik knikte, maar had meer belangstelling
voor haar figuurtje dan voor het landschap in de zon. De wind woei haar
ponnetje iets op, ik zag de glanzende dijen en toen ze iets draaide kon ik,
tegen de zon in, dwars door haar dunne katoentje kijken. De jonge borsten
priemden door de dunne stof, ik kreeg er ongewild een erectie van. Ze wist
dat ik haar lekkers kon zien, maar ze draaide niet terug. Behaagziek streek
ze door de zwarte haarmassa waardoor ik in de opening van het korte mouwtje
kon kijken. Ik zag de aanzwelling van de linkerborst nu duidelijk en kreeg
het echt te kwaad. Op dat moment sprong Moortje op de balustrade en streek
kopjes gevend enige malen langs mijn bovenlijf.

Ik huiverde door de zachte
aanraking van de poesharen met mijn borst en aaide het beest. “Mooie zwarte
poes”, zei ze en zacht “Poesje ... poesje ... poekie, kom dan !” “Net zo
mooi zwart jij” antwoordde ik. Moortje wrong zich langs de scheidingswand
gaf kopjes aan mijn mooie buurmeisje. Ze aaide het lieve diertje en zei
onhoorbaar: “Ja zacht ... ik vind het heerlijk om ‘n zacht poesje te aaien.”
Later kon 'n tong wel afbijten, voor ik wist merkte ik op. “Ik ook, ik vind
niks zo lekker als het aaien van een zacht poesje.” Ze boog blozend het
mooie hoofdje, aaide de poes en keek me schuins aan. De oog spleten
vernauwden zich iets. Zag ik een hete gloed in haar ogen? Toen zei ze zacht
maar zeer duidelijk verstaanbaar: “Dat kan ik me voorstellen, ‘t mijne
zeker!” Uit het veld geslagen zweeg ik, wat moest ik zeggen! Ze draaide zich
nu een halve slag, zodat de zon tussen de iets gespreide benen scheen. Nu
kon ik duidelijk zien dat ze totaal naakt was onder het ponnetje. Mijn lat
brak haast, vooral toen ik zag dat ze er met belangstelling naar keek.
Vanuit het huis klonk een roepende stem. “Vanessa! Vanessa! Waar ben je? Wil
je me even helpen?” Ze gaf de poes een zetje in mijn richting en draaide
zich om. “Oma roept, dag, ik zie je nog wel he?” De hele dag zag ik haar
niet. Ik reed naar Baarle-Nassau om goedkoop te tanken en sigaretten te
kopen. Terug in huis gaf ik de kat eten en bakte patat. Na het eten ging ik
op het nog warme balkon zitten en las een erg schuin romannetje uit de
collectie van mijn zwager. Het begon te schemeren toen ze op het balkon
verscheen. “Hoi, ze slapen eindelijk. Allebei een pilletje, die worden niet
voor acht uur wakker. Heb je iets te drinken voor me? Dan wip ik even over.”
Drie minuten later liet ik haar binnen. Ik gaf haar formeel een hand en zei:
“Hoi Vanessa, ik ben Chris. “Ze aaide even door mijn gezicht en lachte. “Ik
had je naam al van oma gehoord. 't Is leuk om bij hun te zijn, ik hou erg
veel van de ouwetjes. Maar ze worden 'n beetje zeurderig en dan ben ik blij
om met m'n leeftijdgenoten te praten.” “Nou, leeftijdgenoten is wat
overdreven, ik ben veel ouder dan jij. Negentien.” Ik dacht dat ze hooguit
veertien was.

Moortje sprong bij haar op schoot en draaide zich spinnend om
en om tot ze 'n lekker holletje had gemaakt. Vanessa lachte hees. “Hoe oud
denk je dan dat ik ben, veertien soms? Dat denken ze allemaal, ik ben bijna
achttien, over tien dagen.” Ik was oprecht verbaasd. “Ja, ik dacht ook
eerder aan veertien dan aan achttien. Als je al zo oud bent drink je zeker
geen prik meer?” “Nee, een stevige whishy-cola gaat er wel in na zo'n
vermoeiende dag met m'n ouwtjes. Je past op Moortje he? Waar zijn ze naar
toe?” “Tunesië, Sousse. Ga jij nog op vakantie?” Ze schudde het hoofd. “Geen
geld, ik zal me behelpen met af en toe de ouwetjes bezoeken en het aaien van
jouw poes.” Ik zette het glas voor haar neer en keek haar strak aan. “Waarom
zei je dat vanmorgen?” Ze nam een klein slokje en weer zag ik die gloed.
“Omdat jij die dubbelzinnige opmerking maakte. Geef mij nou alsjeblieft niet
de schuld, ik hoorde je denken en zag ....zag... eh.” “Dat mijn onderbroekje
bij na te klein werd. Kan je 't voorstellen? Denk je een oud vrouwtje te
zien en dan verschijnt er plotseling een fee op het balkon met bijna niks
aan. Ik kon dwars door je pon heenkijken.” Ze aaide de poes. “TerwijI ik de
poes aaide, zag jij de mijne. Ik slaap naakt, had dat ding alleen even aan
getrokken omdat ik niet helemaal naakt naar buiten kan lopen.” We zwegen, de
sfeer werd duidelijk broeierig. Ik voelde mijn lul verstijven, zij bewoog
haar benen en draaide in de fauteuil. Moortje sprong van haar schoot, ze
sloot de benen en nu zag ik het hagelwitte slipje tussen haar knieën. Mijn
hand gleed over de zijdezachte huid. Ze boog iets voorover en toen beroerden
haar boterzachte lippen even mijn mond. Toen sloeg de vlam over. Ik knelde
haar in mijn armen en tongde het lieve mondje fel. Haar tongetje schoot naar
binnen en zette me nu helemaal in brand. Ik trok haar uit de stoel en viel
met haar op het hoogpolig tapijt. Ik rukte mijn broek open en toonde mijn
verlangen. “0, wat geil!”, riep ze en greep, met ongekende felheid mijn
grote joekel. Ik schoof het jurkje op tot boven de heupen en zoende de
golvende buik. “Kom.... kom”, hijgde ze, “Ik moet je eerst in me voelen.”
Zij schoof het natte kruisje opzij. Woest drong ik bij haar binnen en boorde
me een weg in haar vulkaanhete lijf. Ik had natuurlijk wel eens eerder een
meisje geneukt, maar zo fel als deze paring had ik er nooit een beleefd.
Vrijwel onmiddelijk kwam ze met een kreet klaar en klemde haar felle
kutspieren om mijn boor. Fel stotend kleedden we elkaar verder uit, alleen
haar slipje kon natuurlijk niet uit. We rolden weer om en nu lag ik onder
het fel neukende tienerlijf. Haar kleine harde borsten priemden in mijn
gezicht, ik zoog fel op de tepels, die verkleurden tot een dieprood.

“Gebruik je de pil?”, vroeg ik hijgend. “Ja, kom maar, stoot je geile lul
maar leeg bij mij. Kan je nog even, ik kom weer.....oeh
......jaaaahhh......mmmm .......wat doe je met me.....anders ben ik nooit
zo gauw geil.......oooooohhhhhh ..... Chris ........ik wil de hele nacht met
jou .......’t komt .......nuuuuu!!!!!” Ze zonk op me neer en wrikte de
kletsnatte schaamlippen over mijn ballen. Kreunend spoot ik haar vol en beet
op de tepels. Klaaglijk kreunend schoof ze heen en weer en kreeg een nieuw
hoogtepunt. Stil lagen we uit te hijgen en gaven elkaar kleine en grote
kussen. Ze trok het drijfnatte slipje uit en hield het tegen het licht.
“Jouw geil, ik zal het niet wassen en altijd zo bewaren.” Ze schuurde haar
frele lijfje weer over het mijne en bezorgde me zo een nieuwe opsteker. “Ik
wil je zuigen, je grote lul helemaal inslikken. Je mag m'n bek volspuiten.
Heb ik nog nooit beleefd, maar vanavond wil ik alles meemaken.” Ze was het
tweede meisje, dat me afzoog. Maar de eerste was een onervaren trut
vergeleken bij haar. Ze likte 'm van onder tot boven, liet 'm ver in haar
kwijlende mond doorstoten en zoog lang op m'n ballen. Toen mijn zaad over
haar lippen golfde kokhalsde ze en liet even los. “Zuig .....Zuig”, siste
ik. Haar lippen sloten luchtig over mijn spuit en ik zag hoe ik haar vol
kledderde. Ze viel vermoeid achterover en spreidde haar benen. Ik keek in de
glinsterende spleet en zette mijn mond erop. Nu was het mijn beurt haar gek
te maken. Mijn handen dwaalden overal over het kronkelende lichaam. Als een
wilde boskat schoof ze de hele kamer door, achtervolgd door mijn geile tong.
Ook haar anus kreeg een enorme likbeurt. En al die tijd fluisterde ze: “0
Chris, wat geil, wat ontzettend geil ......zo geil ben ik nog nooit geweest
ik heb notabene een vriend.... al twee jaar ik ben hem ontrouw kan me niks
verrotten.... o .....geil....... ik kom .........wat geil ........aai m'n
poes ....... lik me ...........maak me klaar.” Met overgave likte ik haar de
zevende geilhemel in. Op het moment dat ze begon klaar te komen stak ik m'n
stijve lat er gauw weer in en nu werd ze helemaal knots.

Ze moest haar hand
voor de mond houden, anders had de hele buurt haar horen schreeuwen. “Geil
wijf.... geil mokkel geile neukpoes ik neuk je gek” riep ik en stootte nog
iets dieper. Er scheen geen eind aan haar genot te komen, ze raakte bijna
buiten westen van mijn felle stoten. Haar benen knelden om mijn heupen, de
schokkende bulk kletste tegen mijn lichaam, ze kromp ineen en rekte zich
weer. Het was een feest deze poes tot orgasme te brengen. Eindelijk waren we
uitgeraasd. We lieten elkaar los en rookten, naar het plafond starend. “Ben
ik niet door en door slecht Chris? Ik heb al twee jaar verkering en zal wel
met hem trouwen. Ik geef niks om jou ik ben alleen maar geil geworden van
jouw opmerking vanmorgen. De hele dag heb ik aan vanavond lopen denken, ik
heb me vanmiddag op de W.C. zelf geholpen, zo geil was ik.” “ Zit je er nu
over in, dat je je vriend ontrouw bent geweest?”, vroeg ik. “Nee, nee en nog
eens nee! Ik ga nu naar de ouwtjes, maar morgenavond kom ik weer en alle
dagen zolang we hier zijn.” De volgende avond kwam ze weer. Ik was naakt
onder m'n kamerjas en toonde haar onmiddellijk mijn stijve. Ze droeg
hetzelfde jurkje, nu met niets er onder. Grommend van geilheid rukten we
elkaar de kleren van het lijf en weer drong ik gelijk naar binnen. En weer
kwam ze gelijk bij de eerste stoot klaar. Haar orgasme was kort maar hevig.
“Ik wil je in m'n reet voelen, daar ben ik nog maagd”, fluisterde ze. Ik
ging op zoek naar iets vettigs en smeerde er nachtcreme van mijn zus op.
Langzaam drong ik in het nauwe gaatje en hield even op om haar te laten
wennen. Ze kreunde en zei dat het pijn deed. Ik drukte weer iets door
terwijI mijn hand de voorkant zocht om haar klitje te strelen. Ze begon te
bewegen, eerst langzaam, maar toen sneller en sneller. “0 Chris, je maakt me
zo geil ....ik wil de hele avond klaarkomen op jouw lul, van voren en van
achteren ......had je maar twee lullen.” Weer ging ik opzoek en vond de
vibrator. De batterijen waren helaas leeg. Ik enterde haar kontje weer en
perste toen de vibrator van voren naar binnen. Vanessa viel van genot in
zwijm. “Geil.... geil....”, mompelde ze. Ik spoot haar darmen vol en keek
even later hoe ze alles naar buiten perste. Het tapijt werd er nat van. De
hele avond bleven we zuigen, likken, neuken, vozen en zoenen tot we tegen
twaalven allebei volkomen uitgeput waren. Met haar lichaam overal besmeurd
met mijn geil ging ze naar de ouwetjes. Elke avond was het raak, ik verloor
liters sperma bij het lieve poesje, dat net als Moortje na afloop spinnend
in mijn armen lag. De vakantiegangers kwamen terug en ik nam afscheid van
iedereen Vanessa gaf ik mijn adres en telefoonnummer. Een maand later belde
ze op. “Ik heb het uitgemaakt met Paul. Ik wil je zien. Luister Chris, ik
ben beslist niet verliefd op je en wil geen vaste verbintenis. Ik ben alleen
maar, je weet wel op je.” Ik zoek haar om de veertien dagen op, het kost me
veel treingeld, maar dat heb ik er wel voor over We moeten het buiten doen,
maar we vinden altijd wel 'n plekje!


Dit sexverhaal is geplaatst op 19 Nov 2008 door eroverhalen
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 ?>