sexverhalen

Gratis sexverhalen - Eroverhalen.com

iedere dag weer nieuwe geile sexverhalen

Nieuwe Sexverhalen

stuur ons uw zelfgeschreven sexverhaal stuur uw verhaal in

Bijzonder triootje
En toen ze weer verscheen, legde ze het aan met de ober en lachend nam ze
Met een borrel in de hand weer plaats op haar stoel. Ze keek weer naar mij en
ik naar haar en we wisten beiden, dat we wat voor elkaar voelden.
Toen de bandleden op het podium terugkeerden, stond zij alweer op om naar
de dansvloer te gaan met dezelfde zus en ik baalde, dat ik geen kans kreeg.
Ik besloot een omweg te kiezen: ik ging ook naar de WC en toen ik klaar was
en de feestzaal weer binnentrad, stond ik pal aan de rand van de dansvloer
en oog in oog met haar! Ze liet haar zus voor wat die was en keek me vragend
aan.
"Zullen we dansen?", vroeg ik.
"Als jij leidt", was haar antwoord, "want ik kan helemaal niet dansen".
"Ik ook niet", zei ik waarheidsgetrouw, "maar ik wil het toch met je
proberen".
Het dansen zal wel nergens op geleken hebben, maar we hadden plezier en ik
vond het heerlijk om haar in mijn armen te houden.
Maar helaas hield de band er alweer mee op en laste alweer een pauze in. Ik
begeleidde haar terug naar haar plaats, maar onderweg werd ze door een
ander familielid aangeschoten en bleef daar hangen. Ik liep door naar mijn
eigen plek en hoorde nog net iemand opmerken: "ze fladdert weer van de een
naar de ander. Ze hangt weer behoorlijk de hoer uit".
Ik keek om en bedacht, dat het wel een zwager of zo zou zijn, aangezien hij
aan de tafel met alle familieleden zat. Toen ik bij mijn stoel arriveerde,
stonden meteen mijn teamgenoten op, omdat ze naar huis wilden. Ik dronk mijn
glas staande leeg en liep er achteraan.
Toen ik weer de familie passeerde, zag ik haar weer en nu was ze weer aan de
praat met de ober. Ze hadden lol en ze was duidelijk met hem aan het
sjansen.
Abrupt draaide ze zich om en vroeg: "ga je nu al weg?".
"Mijn clubgenoten smeren hem, dus waarom zou ik alleen blijven zitten?", zei
ik. "Dan kom je toch gezellig bij ons zitten", zei ze en trok me mee aan mijn
arm.

Hè, ik had mijn doel bereikt. Gelukkig was ik met niemand mee gereden, dus
er was geen enkele reden om met de anderen mee te gaan. Eentje kwam terug
de zaal in om te vragen, waar ik bleef, maar hij zag dat ik bij de familie
ging zitten en zwaaide alleen nog maar even. Ik zwaaide terug en ze vroeg:
"wat wil je drinken?".
Ik bestelde ook maar een borrel en vroeg: "hoe heet je eigenlijk?".
"Carolina", zei ze, "maar iedereen noemt me Carola".
Ze gaf me een hand en ik noemde mijn naam ook. Ze begon te praten en het
klikte geweldig tussen ons. Het gesprek liep als een trein en ik vertelde
over mijn leven. We zaten duidelijk op dezelfde golflengte, hoewel ik gescheiden
was en zij een verstokte vrijgezel was. Ze had wel eens een min of meer
vaste relatie gehad, maar dat was spaak gelopen en nu was nog steeds blij met
haar vrijheid. Ze kon in elk geval versieren wie ze wou en ze vertelde, dat
de in de familie de naam van 'femme fatale' had.
'Nou', dacht ik, 'ook wel iets meer dan dat. Ik hoorde toch een hele andere
term daarstraks'.
In elk geval was duidelijk, dat ze een losbol was en als ik het goed
aanpakte, had ik vannacht een lekker wijf te neuken. Het bleek, dat ze met de hele
familie in een hotel zaten en zij had een eenpersoons kamer.
'Mooi', dacht ik, 'alleen maar meer kans'.
We hebben nog een hele tijd zitten praten en drinken en toen we beiden
concludeerden, dat de drank haast overvloedig begon te worden, zijn we
maar weer gaan dansen. Het was leuk en toen het nummer afgelopen was, zei
Carola, dat ze weer naar de WC moest. Ik ging terug naar mijn stoel en
Voelde me al aardig aangeschoten. Even later verscheen Carola weer en knoopte
opnieuw een gesprek aan met de ober. Ik bekeek hem eens goed en vond het wel
een leuke knul. Hij zou een vriend van mij kunnen zijn en van zijn uiterlijk
had ik ook wel wat willen hebben, want hij zag er goed uit, al klaag ik ook
niet over hetgeen ik mee bedeeld ben. Maar toch - als ik had kunnen
kiezen...
Al snel kwam Carola terug en ze zei oprecht: "die ober is net zo'n aardige
vent
als jij. Heb je geen zin om met hem te dansen? Ik vind het heel sexy om twee
mannen te zien dansen met elkaar. Waarom kan dat eigenlijk niet?".

Gelukkig betekende die laatste zin, dat ik het niet echt hoefde te doen,
Want hoewel ik geen onoverkomelijke bezwaren had, zag ik het toch niet zitten om
midden in een grote feestmenigte met een andere man te gaan dansen.
Carola bleef maar praten en volgens mij kwam dat mede, omdat ze ook meer
dan genoeg drank op had.
Na verloop van tijd was het feest afgelopen en was het tijd om te
vertrekken.
Ik wilde graag met de familie mee naar het hotel, maar durfde het eigenlijk
niet rechtstreeks te vragen. Gelukkig was het een broer Carola, die mij een
kans voor open doel gaf.
"Jij gaat zeker met ook mee?", vroeg hij met een glimlach.
Voordat ik antwoord kon geven, had Carola al bevestigend geantwoord, maar
liep weg naar de ober. De rest van de familie maakte nog niet veel haast
om weg te komen en het duurde lang totdat Carola weer terug kwam.
"Kun je niet kiezen vandaag?", vroeg dezelfde broer aan haar.
Ik besefte, dat ik niet de enige voor haar was en snapte opeens, wat ze het
liefste wou.
"Wil je hem er ook bij hebben?", fluisterde ik zachtjes in haar oor.
"Vind je dat geen bezwaar?", vroeg ze opgetogen.
"Niet echt", zei ik, "waarom zou ik ook. Het is tenslotte jouw keuze, wie er
met je mee gaan".
"Ik ben natuurlijk niet de enige hier, die een keuze maakt. Ik zou het
namelijk heel jammer vinden als jij door hem afhaakte. Maar ik vind je voorstel
geweldig", zei ze en weg was ze om de ober aan te schieten.
Ik zei nog: "een triootje is nooit weg", maar ze hoorde het al niet meer.
Ze bleef weer lang weg en het feest liep duidelijk ten einde. De zaal begon
leger te worden en ik begon me te vervelen. Ik besloot om Carola en de ober
maar eens op te zoeken, want al was de ober nog druk in de weer - ze
voerden steeds geanimeerd gesprekken en Carola deed heel druk. Ze had
het hoogste woord en volgens mij moest ze de ober overhalen om met een
triootje mee te gaan doen. Ik sloot me bij hun aan.
"Dit is Robert", zei Carola. Ik noemde mijn naam en gaf hem een hand. Van dichtbij oogde hij nog
sympathieker dan ik ingeschat had van afstand, maar hij maakte zich meteen
uit de voeten.

"Problemen?", vroeg ik Carola.
"Ja, een beetje", zei ze, "hij wil wel graag mee. Weet je - hij is zelfs bi.
Te gek, vind je niet? Gaan jullie samen dansen op mijn kamer? Alsjeblieft?"
Ik knikte.
"Maar hij is nog lang niet klaar met zijn werk", ging Carola verder, "na het
feest moet hij nog opruimen en weet ik veel wat nog allemaal meer. Het kan
nog wel een uur duren voor hij klaar is".
"Tsja, wachten we daarop?", vroeg ik.
Carola zweeg en dacht na. Prompt kwam Robert terug en zei: "ik kan zo weg.
Over tien minuten ben ik klaar".
"Hoe heb je dat geregeld?", vroeg Carola.
"Een perfecte baas en een aardige collega", zei hij, "al moet ik er wel een
halve dag extra voor werken op mijn vrije dag".
"Te gek", zei Carola, "ik ga mijn jas vast halen".
Weg was ze en Robert en ik keken elkaar aan.
"Wat een tante, niet", zei ik.
"Zeg dat wel", zei Robert, "maar hoe zit dat met jou? Zie je het zitten -
samen met haar EN mij".
"Zullen we eens gek doen", zei ik, "we gaan haar helemaal de kop gek maken.
Wij gaan dansen op de hotelkamer, maar dan geef ik jou een kus. Kijken hoe
Ze reageert. En dan grijp jij mij in het kruis. Wedden dat ze uit haar bol
gaat?".
"Prima", zei Robert, "we doen net of we het met z'n tweeën willen gaan doen
en negeren haar een beetje. En dan gaan we haar samen verwennen - ze zal
de nacht van haar leven hebben".
We deden een 'high-five' en we namen elk nog een borrel. Zo te merken had
Robert er ook al genoeg op en ik voelde me ook al aardig licht in het hoofd.
Carola kwam er weer aan en Robert ging zijn werk afmaken.
"Gaat het goed tussen jullie twee?", vroeg ze, "klikt het?".
"Prima", zei ik, "dat wordt wel wat. Maar hoe zit het met jou? Waar hou jij
van? Oraal?"
"Ja hoor", antwoordde ze.
"En anaal ook soms misschien?", vroeg ik weer.
"Ach jongen, als het maar lekker is - dan hou ik overal van. We gaan gewoon
lekker vrijen dus", zei ze en dronk haar borrelglaasje leeg.
Robert kwam er aan gelopen en we vertrokken naar het hotel. Carola haalde de
sleutel bij de receptie, maar meldde ons niet aan en illegaal slopen we met
haar mee naar d'r kamer. We deden onze jassen uit en Carola liep naar de
koelkast.
"Wie wil nog een borrel?", vroeg ze, maar zowel Robert als ik hadden genoeg
gehad. Tenminste als we nog wat wilden presteren in bed, want al was ik op
dat moment erg in stemming - als ik nog meer ging drinken dan kreeg ik
teveel en werkte het averechts. Carola nam nog wel een en zette de radio aan.
Robert en ik keken elkaar aan.
"Vooruit - dansen jullie", zei ze, "jullie hebben het beloofd".
Een beetje onwennig schoven Robert en ik naar elkaar toe en pakten elkaar
vast. Toen begonnen we en al snel zwierden we door de hotelkamer.
"Geweldig", kirde Carola, "o, wat een sexy gezicht. Ik ben helemaal
opgewonden".
Ik knipoogde naar Robert en naderde zijn mond. Zijn hand ging al omlaag en
Ik kuste hem vol op zijn lippen. Gelijktijdig voelde ik zijn hand over mijn
Bobbel gaan en hij streek over mijn lul. Carola keek of ze water zag branden en
Robert en ik kregen er lol aan. We deden net of Carola niet bestond en ik begon
Robert zijn broek los te maken.
"Wat doen jullie nou?", vroeg Carola, "wat gaan jullie doen?".
We reageerden niet en dansten richting bed. Daar lieten we ons op vallen en
Robert maakte mijn broek ook los. Hij had als bisexueel duidelijk veel meer
ervaring in dit soort situaties, maar ik liet me niet kennen. Ik haalde zijn
halfstijve lul tevoorschijn en begon hem in een rustig tempo af te trekken.
Hij draaide bij en ging met zijn hoofd omlaag. Terwijl ik bleef rukken, deed hij
mijn broek omlaag en zodra mijn lul bloot was, begon hij me te pijpen.
Carola raakte in extase en kwam er op haar neus bij staan.
"O, wat mooi", zei ze, "dit is nog veel geiler dan in mijn stoutste dromen.
Zal ik helpen?".
We negeerden haar gewoon, maar ze liet het niet op haar zitten en kwam
naast me liggen. Ze haalde mijn hand weg en begon Robert te pijpen. Ik vond
alles best en begon haar uit te kleden. Snel had ik haar broek en slip uit
getrokken en zocht haar werkelijk drijfnatte kut. Zonder tijd te verliezen
begon ik haar te beffen en ik merkte, dat ze heel heftig reageerde. Ze was
bloedgeil, maar zoog Robert ondertussen driftig af en hield nauwlettend in de gaten,
hoe die mij afzoog. Ik likte over haar harde, uitpuilende klit en neukte haar
met twee vingers. Ik zag kans om mijn duim in haar kont te prikken en prompt
begon ze te schokken. Ze kwam heftig klaar en keek met een wilde blik toe,
hoe Robert mijn pik verzwolg.
"Spuit", lispelde ze onder het klaarkomen, "spuit het in zijn mond".

Maar ik was nog niet zover en hoe zeer ik mijn best ook deed - ik was nog
Niet geil genoeg. Blijkbaar remde de hoeveelheid drank toch mijn lust en er moest
echt nog meer gebeuren om mij aan het spuiten te krijgen. Voor Carola
hoefde het ook niet meer, want haar orgasme voorbij en haar geile stemming
ook. Wel ging ze Robert verder afzuigen met hernieuwde energie, want ze
had het er een beetje bij laten zitten onder het klaarkomen. Maar voor
Robert hoefde het niet meer en hij pijpte mij ook niet meer.
"Ik wil even wat anders", zei hij en liep naar zijn jas. Carola en ik keken,
wat hij ging doen en hij pakte een tube glijmiddel. Toen hij weer bij ons
stond, drukte hij een klodder op de vingertoppen van Carola en ging voorover gebukt
met zijn kont naar haar toe voor haar staan.
"Smeer mij in", zei hij en pakte zelf ook een klodder. Hij smeerde mijn pik
ermee in en toen hij vond, dat het goed genoeg was, kwam hij overeind en
hurkte boven mijn lul. Dit was nieuw voor mij - ik had tot dusver alleen nog
maar vrouwen in de kont genaaid, maar ik moet toegeven, dat het wel een
opwindend gezicht was om mijn pik in zijn gat te zien verdwijnen. Carola
ging alweer uit haar bol en keek geconcentreerd, hoe Robert over mijn lul heen
zakte. Ze dook tussen zijn benen, zodra mijn lul helemaal in hem zat en
begon hem te pijpen. Als een knul met veel ervaring wipte Robert behendig op en
neer en hoewel dit mijn eerste homo contact was, voelde ik mijn zaad al snel
opstijgen. Helemaal toen Carola een vinger in mijn aars priemde en me
daarmee energiek begon te vingeren. Net toen ik dacht zo'n beetje klaar te komen,
kwam Robert overeind en kwam zover omhoog, dat mijn lul uit zijn kont ging.
Meteen ging hij op mijn benen zitten en drukte zijn lul stijf tegen de mijne.
"Zuig ons klaar", zei hij dwingend tegen Carola en die bedacht zich niet en
nam beide lullen gelijktijdig in haar mond. Ze had in de gaten, dat we
beiden op knappen stonden en ze bewoog haar hoofd snel op en neer. Ik keek toe en
vond het wel een opwindend gezicht om twee lullen in haar mond te zien. Ik
voelde hoe ze opnieuw mijn aars binnen drong met haar vinger en zag, dat ze
hetzelfde deed bij Robert. Ik hield het niet meer en explodeerde in haar
mond.
Meteen begon ze te kokhalzen en kwam met haar hoofd omhoog. Een griezelige
hoeveelheid zaad liet ze eruit lopen en ik begreep, dat Robert en ik
tegelijk waren gaan spuiten. Maar Carola liet zich niet kennen en nam onze spuiters
weer tegelijk in haar mond en druk haar hoofd ver omlaag, waardoor onze
pikken diep in haar mond verdwenen. Nu ging ze door tot het einde en aan
haar slikken te zien, verzwolg ze ons zaad. Ik voelde tenslotte mijn lul
verslappen en Robert had ook geen stijve meer. Carola haalde haar hoofd
weg en trok haar vingers eruit - zowel bij Robert als bij mij. Haar mond zat
onder het zaad en het was een en al slijm.
"Jullie spoten tegelijk", zei ze lachend, "en recht in mijn keel. Ik dacht,
dat ik erin stikte. Wat een lading. Heerlijk. Maar nu wil ik nog een keer. Ik
ben hier weer hartstikke geil van geworden. O, wat een lieve pikken".
"Ik moet eerst even op krachten komen", zei ik.
"En anders ik wel", zei Robert. En tegen mij: "hoe vond je het? Was dit de
eerste keer voor jou zo. Ik geloof van wel, hè?".
Ik knikte, maar wel zodanig, dat duidelijk was, dat ik het lekker gevonden
had.
Carola gaf op onze pikken een kusje en kirde: "jullie moeten mij verwennen.
O, dat die geile pik in zijn kont heeft gezeten. Nu moet hij ook in die van
mij".
Ze wees op mijn pik en begon hem te zuigen. Ik lag ontspannen op mijn rug
en meteen kwam mijn pik weer omhoog. Carola ging door en in een paar
seconden tijd had ik weer mijn joekel omhoog staan. Robert ging zich er ook
mee bemoeien en smeerde de reet van Carola in met glijmiddel, waarbij hij
haar ondertussen befte. Carola ging uit haar dak en al snel kwam ze over mij
heen zitten en hurkte boven mijn pik. Robert hielp mee en richtte mijn pik
op haar aars en drukte Carola omlaag, zodat mijn lul in haar gat verdween.
Carola begon driftig op en neer te wippen en Robert befte haar daarbij
onophoudelijk. Carola kreunde enorm en opeens voelde ik een vinger in mijn
reet gepriemd worden. Ik werd bloedgeil en kreeg zin om alweer te gaan
spuiten.
Maar ik hield me in, want ik wilde, dat Carola eerst klaar zou komen. Ik
Trok haar stijf op me, zodat haar rug op mijn buik lag en draaide haar hoofd bij
om haar te kunnen tongen. Ik greep met elke hand een borst vast en masseerde
die stevig. Opeens werd mijn pik uit haar kont gehaald en ik voelde een paar
lippen er omheen sluiten. Carola en ik keken omlaag en zagen, hoe Robert mij
pijpte en Carola vingerde. Ik hield het haast niet meer en Carola ook niet,
want die vond het onwijs geil, dat Robert mij pijpte, terwijl ik haar net
daarvoor in de reet geneukt had. Net toen ik dacht zo ongeveer te gaan
spuiten, stopte Robert en drukte mijn lul weer in de reet van Carola.

Die begon in een hoog tempo op en neer te wippen en leek uit haar dak te gaan.
Robert befte haar nog even en kwam toen tussen onze benen. Ik wachtte af
wat hij ging doen en vernam, dat hij zijn ondertussen ook weer hard geworden
lul bij de mijne in Carola's reet propte. Het ging wat stuntelig en
moeizaam, maar tenslotte schoof hij zijn pik erbij in. Carola gilde het uit en ik
vroeg me werkelijk af of het van de pijn van de uitrekking was of door puur genot.
Samen neukten we haar hard en stootten telkens gelijktijdig naar binnen.
Carola begon nu heel zwaar te hijgen en kwam bijna klaar. Ik ook trouwens en
genoot ervan om de pik van Robert tegen de mijne te voelen en samen Carola
te neuken. Opeens trok Robert zijn pik eruit en ik dacht, omdat hij klaar
zou komen. Maar meteen daarna voelde ik zijn lul tegen mijn kontgat en ik
perste die open om heen toegang te verschaffen. Carola keek omlaag en zag,
hoe Robert zijn pik in mijn kont propte. Het was wel een beetje apart gevoel
en zeker onwennig, want meer dan een vinger van een vrouw had ik er nooit in
gehad. Carola ging uit haar bol en snel wippend op mijn pik begon ze klaar
te komen. Ik ook trouwens, want ze kneep haar aars zo strak samen, dat ik
begon te spuiten. En op dat moment voelde ik mezelf ook volgespoten worden
en tegelijk met Robert kwam ik klaar: ik in de reet van Carola en hij in
de mijne. Wel een gek gevoel om zo maar iets in me gespoten te krijgen. Het
leek wel of ik overvol was: wat aan de ene kant eruit vloog, werd aan de
andere bijgevuld. Maar ik was intussen te aangeschoten om me er echt druk
over te kunnen maken en vond het eigenlijk wel lekker zo en zonder meer erg
geil. We bewogen nog een paar keer in en uit en toen ontspanden we alle
drie. Mijn pik werd slap en Robert gleed ook uit mijn kont weg. Carola kwam
omhoog en mijn pik schoot uit haar kont. Ik voelde het sperma van Robert uit
mijn reet lekken en mijn eigen zaad liep uit de aars van Carola en sijpelde
over haar benen omlaag. Ze liep weg naar de doucheruimte en ik zei tegen
Robert: "wat een geile trut, niet dan?".
"Ja", zei Robert, "het was een lekkere geile bedoening vanavond".
Even later kwam Carola terug.
"Blijven jullie slapen?", vroeg ze.
Even later lagen we elk aan weerszijden van haar en vielen uitgeput in een
welverdiende slaap.
Dit sexverhaal is geplaatst op 03 Dec 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 ?>