Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  3 551
God kveld

Har et selvlaget CMS der jeg har muligheten til å hente opp funksjoner/plugins i WYSIWYG editoren ved å taste inn {function::FUNKSJON(VARIABLER)}. Skal forsøke å forklare hvordan det fungerer under.

Slik skriver jeg ut en nyhet, der $output er diverse markup samt nyheten.

Kode

<?php
parse_output_functions($output)
?>
Denne funksjonen leser igjennom markupen for å lete etter funksjoner "{function::}"

Kode

<?php
function parse_output_functions($content, $pattern='/(\<p\>)?\{function::(.*)\((.*)\)\}(\<\/p\>)?/') {	
	return preg_replace_callback($pattern, 'page_functions', $content);
}
?>
Finner den treff så sender den en callback til funksjonen "page_functions"

Kode

<?php
function page_functions($match) {
	$function  = $match[2];
	$parameter = $match[3];
	
	return $function($parameter);
}
?>
Her er et eksempel som ikke fungerer.

Kode

<p>{function::email(user@domain.tld)} eller {function::email(user@domain.tld)}</p>
Denne skal da kalle opp php-funksjonen email (selvlaget funksjon) med stringen "user@domain.tld" som første parameter.

Jeg har debugget litt og funnet ut at den fungerer strålende om jeg kun har èn funksjon per p-element. Men nå som jeg har to funksjoner i ett p-element går det dårlig. Her er en output av $match i page_functions-funksjonen:

Kode

Array
(
    [0] => <p>{function::email(user@domain.tld)} eller {function::email(user@domain.tld)}</p>
    [1] => <p>
    [2] => email(user@domain.tld)} eller {function::email
    [3] => user@domain.tld
    [4] => </p>
)
Som dere ser på $match[2] så har den tatt med mer enn den skal. Den tar med mer tekst selv etter siste }. Det må derfor være noe galt med det regulære uttrykket som fisker ut funksjonene fra editoren, da den ikke klarer å skille mellom en eller flere funksjoner.

Kode

/(\<p\>)?\{function::(.*)\((.*)\)\}(\<\/p\>)?/
Jeg må innrømme at jeg fortsatt har mye å lære innen regulær-uttrykk, men her har jeg prøvd og feilet lenge nå, og kommer ingen vei. Dette er litt kritisk da funksjonen email konverterer mail-adressen til et format som ikke script/spambotter leser av. CMSet er også i bruk på et større nettsted, så svakheten bør rettes opp i raskt.

Tillegg: <p> må være med i uttrykket da TinyMCE liker å wrappe ALT i p-tagger. Disse må være med så de kan fjernes om de ligger rundt en funksjon.

Tusen takk på forhånd - håper noen forstår problemstillingen og har noen tips!
Sist endret av ma10as; 19. juli 2010 kl. 23:35.
z0p
uʍop ǝpısdn
z0p's Avatar
vær ikke grådig!

Kode

/(\<p\>)?\{function::(.*?)\((.*?)\)\}(\<\/p\>)?/
Sist endret av z0p; 20. juli 2010 kl. 00:40.
Trådstarter
Herlig! Det spørsmålstegnet gjorde jobben sin, ja. Takk skal du ha
z0p
uʍop ǝpısdn
z0p's Avatar
Sannsynligvis vil du også ha en "lookbehind" for å sjekke at du "</p>" matcher en "<p>" umiddelbart foran "{function::...", slik at du ikke fjerner avsluttende p-tag i "<p>begynnelsen på paragrafen med min {function::(myfunc)(myparam)}</p>" og omvendt
Sist endret av z0p; 20. juli 2010 kl. 01:20.