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:
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:
[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:
[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.
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); } }
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=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; ?>
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.