mboost-dp1

PHP quote funktion


Gå til bund
Gravatar #1 - chimpansen
23. nov. 2010 13:16
Hej alle her på newz.
Jeg har gennem lang tid læst her på siden – men har nu oprettet en bruger, da jeg har behov for hjælp :)

Jeg er ved at udvikle et debatfora i PHP. Jeg vil gerne lave en citationsfunktion som her på newz.

Min problemstilling er nu, at jeg ikke helt ved, hvordan jeg skal gribe det an.
Lad os antage, at citationsfunktionen bliver noget i stil med følgende:
[quote|nickname|timestamp]
Bla bla bla
[/quote]

Hvordan vil I gribe det an I PHP mht. at ”ekstrahere” hhv. nickname og timestamp fra åbnings quote-tagget? Hvis jeg ikke skulle have både nickname og timestamp med, ville jeg jo blot kunne lave en str_replace på både åbnings og luk tagget; men jeg kan ikke umiddelbart overskue, hvordan jeg opnår det jeg vil.

Har I nogle forslag :)? Nogle funktioner som jeg skal kigge på?

På forhånd tak for hjælpen!
Gravatar #3 - squad2nd
24. nov. 2010 10:38
#1
Her er en dansk artikel omkring regular expressions in PHP:

Hvis du havde hele hele strengen separeret af fx colon (:)
Kunne du fx: quote:nickname:timestamp ... og bare brugt en PHP split function på strengen.

Noget i den dur.
Gravatar #4 - Daniel-Dane
25. nov. 2010 19:48
Ellers har jeg newz.dk's quote-funktion, hvis jeg må udgive den. :P

Pis, det er en gammel funktion!
Gravatar #5 - arne_v
30. nov. 2010 00:59
#4

Og den er lavet om mange gange indenfor de sidste år p.g.a. diverse fejl.
Gravatar #6 - Daniel-Dane
30. nov. 2010 09:54
Ja, men jeg har faktisk den næsten seneste version, som dog har en lille crash-fejl. Den understøtter i hvert fald quote i quote. :P
Gravatar #7 - chimpansen
2. dec. 2010 12:55
Hej allesammen!
Tak for jeres svar :)

Jeg har prøvet at kigge på regex, men jeg har svært ved at overskue, hvordan det skal gøres.

Er der nogen af jer som har et eksempel I kan dele (hint, Daniel-Dane)? Det vil jeg sætte meget stor pris på :)
Gravatar #8 - Daniel-Dane
2. dec. 2010 13:57
Here goes. Hvis han ikke kan lide det, må han slette indlægget. :P
mandalae skrev:
Hey,
Du må meget gerne hjælpe. Din funktion virkede ikke i nyheder, men jeg har i stedet lavet den her rekursive funktion som parser alting rigtigt, desværre virker det til at der er et tilfælde hvor den går i uendelig løkke, så hvis du kan spotte det er din hjælp meget velkommen :)
static function quoteCallBackLoop($text, $start = 0, $posArr = array()){
preg_match( "/\
+?)\)(=.+?,.+?)?\](.+?)\[\/quote\](?!((.*?)\[\/quote\]))/
s", $text, $match, null, $start);
$pos = strpos($text, $match[0], $start);
if ($pos !== false && !in_array($pos, $posArr) && strlen($match[0]) > 0){
array_push($posArr, $pos);
return Z4_Parse::quoteCallBackLoop($text, $pos+1, $posArr);
} else {
if (count($posArr) > 0) {
$posi = array_pop($posArr);
$newpos = isset($posArr[count($posArr)-1]) ? $posArr[count($posArr)-1] : 0;
$end = strpos($text, '(.+?)? \(([0-9
') - $posi + 8;
$str = substr($text, $posi, $end);
$baseStr = preg_replace( "/\
+?)\)(=.+?,.+?)?\](.+?)\[\/quote\](?!((.*?)\[\/quote\]))/
s", '</p><blockquote cite="\\1 (#\\2)"><p>\\4 <cite><a href="#\\2">\\1 (#\\2)</a></cite></p></blockquote><p>', $str);
$text = substr_replace($text, $baseStr, $posi, $end);
return Z4_Parse::quoteCallBackLoop($text, $newpos, $posArr);
} else {
return $text;
}
}
}
Gravatar #9 - chimpansen
2. dec. 2010 18:16
Daniel-Dane, mange tak :)

Jeg får dog en fejl vedr. linje 3. Jeg har sjusset mig frem til, at det har noget at gøre med for mange paranteser, som ikke er lukket.
Har du nogen idé om hvad der går galt? :)
Gravatar #10 - Daniel-Dane
2. dec. 2010 18:30
Det er sikkert bare linjeknæk, som ødelægger det. Den burde compilere.
Gravatar #11 - chimpansen
2. dec. 2010 19:19
Hej igen :)

Det tror jeg nu ikke - men det kan godt være, at du har ret.

Dette er den fejl, som jeg får:
Warning: preg_match() [function.preg-match]: Compilation failed: unmatched parentheses at offset 3

Siger det dig noget? Jeg gennemgår lige koden igen, for at sikre mig, at det ikke bare er et linebreak :)
Gravatar #12 - Windcape
3. dec. 2010 08:03
@Daniel:

Det er news.dk som har ødelagt det. Prøv selv at se:

"/\+?)\)"

Tegn nr. 5, er en ), uden en foregående ). Jeg gætter på det skulle have været:

"/\((+?)\)"

(Den første slash er en delimiter)

@chimpansen:

At du ikke selv kunne opdage og rettet det er ikke imponerede. Prøv nu forhelvede at bruge lidt energi på at forstå kode, i stedet for bare at copy&paste.
Gravatar #13 - fjols
3. dec. 2010 09:59
#12: Med det navn kan jeg ikke lade være med at tænke: "Monkey see, monkey do" ;)
Gravatar #14 - chimpansen
3. dec. 2010 13:43
Windcape (12) skrev:
@Daniel:
@chimpansen:

At du ikke selv kunne opdage og rettet det er ikke imponerede. Prøv nu forhelvede at bruge lidt energi på at forstå kode, i stedet for bare at copy&paste.


... Check your premisis. Jeg er ikke ude på at imponere dig, så dit udsagn klinger ret hult, bassemand ;)

Derudover løser dit forslag ikke noget - jeg får stadigvæk samme fejl, men jeg værdsætter din hjælp. Det er cool, at du har gjort en indsats og forsøgt at hjælpe :)
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login