Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Nie wykonanie się kodu, jak?
marcim
post 16.10.2009, 21:10:12
Post #1





Grupa: Zarejestrowani
Postów: 43
Pomógł: 0
Dołączył: 10.06.2006
Skąd: Kłodzko

Ostrzeżenie: (0%)
-----


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

Ten post edytował marcim 16.10.2009, 21:11:50


--------------------
Jeżeli przewidziałeś cztery możliwe awarie i zabezpieczyłeś się przed nimi, to natychmiast wydarzy się piąta, na którą kompletnie nie byłeś przygotowany"[Murphy]"
Go to the top of the page
+Quote Post
Burned
post 17.10.2009, 01:14:58
Post #2





Grupa: Zarejestrowani
Postów: 67
Pomógł: 8
Dołączył: 19.05.2004
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


W miejscu gdzie przypisujesz cały kod do kolorowania do zmiennej używaj apostrofów zamiast cudzysłowów.
Temat: PHP cudzyslow a apostrof
Go to the top of the page
+Quote Post
marcim
post 17.10.2009, 19:13:35
Post #3





Grupa: Zarejestrowani
Postów: 43
Pomógł: 0
Dołączył: 10.06.2006
Skąd: Kłodzko

Ostrzeżenie: (0%)
-----


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


--------------------
Jeżeli przewidziałeś cztery możliwe awarie i zabezpieczyłeś się przed nimi, to natychmiast wydarzy się piąta, na którą kompletnie nie byłeś przygotowany"[Murphy]"
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.07.2025 - 17:48