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.
  2 671
I en tidligere tråd prøve jeg å få Text_Highlighting (PEAR) til å fungere, og klarte til slutt å løse problemet.
Men ganske kjapt etter at det problemet var løst, fattet jeg mistanke om at et annet problem hadde oppstått.
Jeg har nå uansett gått vekk fra Text_Highlighting og over til GeSHi i stedet.

Saken er som følger; jeg ønsker å ha muligheten til å poste kildekoder på en webside, da med syntax highlighting. Dette har jeg forsåvidt fått til med GeSHi, men det fungerer bare med én kodeboks, og det holder dessverre ikke.

Jeg har laget en funksjon som ved hjelp av regular expressions skal søke opp og erstatte eventuelle kodebokser som finnes i data-en som blir hentet ut fra en database:

Kode

function replaceCodeTag(&$str) {
	$numberOfMatches = preg_match_all('/\[code=(.*?)\](.*?)\[\/code\]/s', $str, $matches, PREG_SET_ORDER);

	for ($x=0; $x < $numberOfMatches; $x++) {
	
		$language = $matches[$x][1]; //Hvilket språk?
		$source = $matches[$x][2]; //Kodesnutt som skal bli skrevet over med preg_replace
		
		$geshi = new GeSHi($source, $language);
		$highlightedCode = $geshi->parse_code();

		$str = preg_replace("/\[code=(.*?)\](.*?)\[\/code\]/s", $highlightedCode, $str);
	}
}
Funksjonen over klarer å legge til syntax highlighting, men den klarer bare å bruke informasjonen fra den første kodeboksen den finner. Alle andre kodebokser den evt. finner blir oversett.
Det virker rett og slett som om den ikke klarer å loope gjennom $matches-arrayet.


Eksempel på problem:

Kode

<?php
require('/inc/geshi.php');

$testString = '
[code=php]<?php echo $match1; ?>
[code=php]<?php echo $match2; ?>[/code]
[code=mysql]bla.bla.bla.[/code]
';

echo "Before preg_replace: <br />" . $testString . "<br /><br />";

echo "After preg_replace: <br /> ";
// $matches[0][0] inneholder code-tag og innhold.
// $matches[0][1] inneholder hvilket språk som skal benyttes.
// $matches[0][2] inneholder kildekoden.

replaceCodeTag($testString);


function replaceCodeTag(&$str) {
$numberOfMatches = preg_match_all('/\[code=(.*?)\](.*?)\[\/code\]/s', $str, $matches, PREG_SET_ORDER);

for ($x=0; $x < $numberOfMatches; $x++) {

$language = $matches[$x][1]; //Hvilket språk?
$source = $matches[$x][2]; //Kodesnutt som skal bli skrevet over med preg_replace

$geshi = new GeSHi($source, $language);
$highlightedCode = $geshi->parse_code();

$str = preg_replace("/\[code=(.*?)\](.*?)\[\/code\]/s", $highlightedCode, $str);
}
}

echo $testString;

?>[/code]

Og output:

Kode

Before preg_replace:
[code=php]<?php echo $match1; ?>
[code=php]<?php echo $match2; ?>[/code] [code=mysql]bla.bla.bla.[/code]

After preg_replace:

<?php echo $match1; ?>

<?php echo $match1; ?>

<?php echo $match1; ?>[/code]

Som dere ser så finner den alle kodeboksene i stringen $testString, men bruker bare informasjonen fra den første den finner.
JEG mistenker at det har noe med objektet som blir opprettet å gjøre, men nå er jeg ikke så dreven på dette området, så for alt jeg vet er det noe annet som forårsaker feilen.


Noen som har en idé om hvordan dette kan fikses, og hva jeg gjør feil?
Tror jeg har fått med all nødvendig informasjon nå, men hvis det er noe som er uklart så er det bare å spørre.
Tror du hadde funnet feilen ved å bruke var_export inni for-løkka di. Det jeg tipper skjer er at preg_replace erstatter ALLE kodetaggene første gang den kjøres. De to andre gangene løkka kjøres er det ingenting å replace. Dette kan du løse ved å legge til ,1 som paramter til preg_replace for å sikre at den bare gjør en erstatning.
Helt utrolig at jeg ikke fanget opp dette da jeg leste om preg_replace.
Uansett, takk for svar - du løste problemet mitt