Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Nie wykonanie się kodu, jak?
Forum PHP.pl > Forum > PHP
marcim
Witam!
Mam problem. Podczas pisania skryptu do kolorowania składni (coś a'la to z forum phph.pl) napotkałem problem jak kolorować kod pomiędzy znacznikami [,code][/,code] na odpowiednie kolory.Rozwiązaniem było geshi. Wszystko ładnie pięknie, lecz po wyciągnięciu kawałka do pokolorowania, zamienia ono zmienne, czyli kod:
  1. <?php
  2. class ColorSyntax {
  3. public function SearchCode($content) {
  4. $content = preg_replace("#\[code lang=\"(.*?)\"\](.*?)\[\/code\]#sie", '$this->PreformBlock("\\1","\\2")', $content);
  5. return $content;
  6. }
  7.  
  8. public function PreformBlock($lang, $source){
  9. $source = stripslashes($source);
  10. $result = $this->HighlightCode($source, $lang);
  11. return $result;
  12. }
  13.  
  14. public function ParseCode($content){
  15. return $this->SearchCode($content);
  16. }
  17.  
  18. public function HighlightCode($source, $lang ){
  19. $geshi = new GeSHi($source, $lang);
  20. $geshi->set_source($source);
  21. $result = $geshi->set_language($lang);
  22. $geshi->enable_line_numbers(GESHI_NORMAL_LINE_NUMBERS);
  23. $result = $geshi->parse_code();
  24. return $result;
  25. }
  26. }
  27. ?>

I teraz $content to:
  1. [code lang="php"]
  2. $zmienna = 6;[/code]

Egzemplarzowanie:
  1. include('class/stringHighlight.php');
  2. include('geshi/geshi.php');
  3. $color = new ColorSyntax();
  4. $tresc = $color->ParseCode($trescBefore);

I teraz po wywołaniu tego zwróci pokolorowane, lecz usunie zmienne, nie pokaże ich, czyli powyższy przykład to:
  1. = 6;

I teraz dzieje się to przy wyciąganiu fragmentu kodu poprzez backreference.
  1. public function ParseCode($content){
  2. echo $ content;
  3. return $this->SearchCode($content);
  4. }

Pokaże [code lang="php"]$zmienna = 6;[/code]
ale następny krok:
  1. public function PreformBlock($lang, $source){
  2. $source = stripslashes($source);
  3. $result = $this->HighlightCode($source, $lang);
  4. return $result;
  5. }

Pokaże już = 6;
Jak zrobić aby to co jest łapane w backreference nie było interpretowane?
pozdrawiam
Burned
W miejscu gdzie przypisujesz cały kod do kolorowania do zmiennej używaj apostrofów zamiast cudzysłowów.
Temat: PHP cudzyslow a apostrof
marcim
Tak, ale poprzez przypisanie do backreference fragmentu kodu jest on interpretowany. A tam nie mam jak zmienić, bo jest on już interpretowany w locie.
  1. public function SearchCode($content)
  2. {
  3. $content = preg_replace("#\[code lang=\"(.*?)\"\](.*?)\[\/code\]#sie", '$this->PreformBlock("\\1","\\2")', $content);
  4. return $content;
  5. }

Jak zrobić, aby "\\2" nie reinterpretowało zmiennych zawartych w backreference? Nie mogę tego umieścić w '\\2' bo to będzie ciąg znaków a nie backreference.
Pozdrawiam
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.