Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> problem z " i \", skrypt kolorowania składni php
angel2953
post 23.07.2004, 21:14:37
Post #1





Grupa: Zarejestrowani
Postów: 199
Pomógł: 5
Dołączył: 8.07.2004
Skąd: gdynia

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


Witam,
Mam funkcje kolorowania składni php z coyot'a 0.9.0 (chyba albo 0.9.1) i nieco ją przerobiłem ale mam problem z \" a mianowicie:
jeśli mam takie coś:
Kod
$text = "jakiś sobie tekst w całości pokolorowany";

to mi go poprawnie koloruje ale jeśli w kodzie znajdzie się \" to już zaczynają sie schodzy:
Kod
$text = "jakiś sobie tekst pokolorowany \"ten tekst nie jest pokolorowany \"a ten już jest";

i jak to teraz poprawić by ignorował znaki " poprzedzone \ questionmark.gifquestionmark.gifquestionmark.gifquestionmark.gif
oto f-cja:
  1. <?php
  2.  
  3. function PHPHighlight($body) {
  4. global $PHP_RESERVED;
  5. //wyodrębnienie zawartosci calego tekstu z wnetrza <php></php>
  6. preg_match_all( &#092;"|<php>(.*?)</php>|si\", $body, $matched );
  7. for( $i = 0; $i < count( $matched[1] ); $i++ ) {
  8. //usuwanie znacznikow HTML
  9. $html = htmlspecialchars( $matched[1][$i], ENT_NOQUOTES );
  10. $html = str_replace( &#092;" \", \"&nbsp;\", $html );
  11. //dzielenie tokenów komentarzy i stringów # /* */ // ' \" ` '
  12. $tokens = preg_split( &#092;"(#|/*|*/|'|\".'\"'.\"|`|n|//)\", $html );
  13. $tokens_count = count( $tokens );
  14. preg_match_all( &#092;"(#|/*|*/|'|\".'\"'.\"|`|n|//)\", $html, $separators );
  15. $result = &#092;"\";
  16. //teraz dla tokenów jazda !!
  17. for( $j = 0; $j < $tokens_count; $j++ ) {
  18. //pogrubianie slów kluczowych
  19. $token = $tokens[$j];
  20. for( $w = 0; $w < count( $PHP_RESERVED ); $w++ ) {
  21. $token = preg_replace( &#092;"/b$PHP_RESERVED[$w]b/i\", \"<font color=\"#0000ff\">$PHP_RESERVED[$w]</font>\", $token );
  22. }
  23. //kolorowanie liczb
  24. $token = preg_replace( &#092;"/b([0-9]+)b/i\", \"<font color=\"#BBAA11\">1</font>\", $token );
  25. //kolorowanie zmiennych
  26. $token = preg_replace( &#092;"/($[0-9a-zA-Z_]+)/i\", \"<font color=\"#007700\">1</font>\", $token );
  27. $token = preg_replace( &#092;"/(${.+})/i\", \"<font color=\"#ff00ff\">1</font>\", $token );
  28. $result .= $token;
  29. //sprawdzanie komentarzy: komentarze i stringi sa parsowane BEZ sprawdzania słów k
    luczowych wewnątrz
  30. switch( $separators[0][$j] ) {
  31. case &#092;"/*\": {
  32.  $result .= &#092;"<font color=\"c0c0c0\\"><i>/*\";
  33.  while( ( $j < $tokens_count - 1 ) && ( $separators[0][++$j] != &#092;"*/\" ) ) {
  34.  $result .= $tokens[$j].$separators[0][$j];
  35.  }
  36.  $result .= $tokens[$j].$separators[0][$j].&#092;"</i></font>\";
  37.  break;
  38.  }
  39. case &#092;"#\": {
  40. $result .= &#092;"<font color=\"c0c0c0\\"><i>#\";
  41. while( ( $j < $tokens_count - 1 ) && ( $separators[0][++$j] != &#092;"n\" ) ) {
  42. $result .= $tokens[$j].$separators[0][$j];
  43. }
  44. $result .= $tokens[$j].$separators[0][$j].&#092;"</i></font>\";
  45. break;
  46. }
  47. case &#092;"//\": {
  48.  $result .= &#092;"<font color=\"c0c0c0\\"><i>//\";
  49.  while( ( $j < $tokens_count - 1 ) && ( $separators[0][++$j] != &#092;"n\" ) ) {
  50.  $result .= $tokens[$j].$separators[0][$j];
  51.  }
  52.  $result .= $tokens[$j].$separators[0][$j].&#092;"</i></font>\";
  53.  break;
  54.  }
  55. case &#092;"'\": {
  56. $result .= &#092;"<font color=\"ff0000\\">'\";
  57. while( ( $j < $tokens_count - 1 ) && ( $separators[0][++$j] != &#092;"'\" ) ) {
  58. $result .= $tokens[$j].$separators[0][$j];
  59. }
  60. $result .= $tokens[$j].$separators[0][$j].&#092;"</font>\";
  61. break;
  62. }
  63. case &#092;"\"\": {
  64. $result .= &#092;"<font color=\"ff0000\">\"\";
  65. while( ( $j < $tokens_count - 1 ) && ( $separators[0][++$j] != &#092;"\"\" ) ) {
  66. $result .= $tokens[$j].$separators[0][$j];
  67. }
  68. $result .= $tokens[$j].$separators[0][$j].&#092;"</font>\";
  69. break;
  70. }
  71. case &#092;"`\": {
  72.  $result .= &#092;"<font color=\"ff0000\\">`\";
  73.  while( ( $j < $tokens_count - 1 ) && ( $separators[0][++$j] != &#092;"`\" ) && ( $separators[0][$j] != \"n\" ) ) {
  74.  $result .= $tokens[$j].$separators[0][$j];
  75.  }
  76.  $result .= $tokens[$j].$separators[0][$j].&#092;"</font>\";
  77.  break;
  78.  } 
  79. default: $result .= $separators[0][$j];
  80. }
  81. }
  82. $body = str_replace('<php>' . $matched[1][$i] . '</php>', '<font face=\"Courier New\">' . $result. '</font>', $body);
  83. $body = str_replace('&amp;', '&', $body);
  84. }
  85. return $body;
  86. }
  87.  
  88. ?>


powyższa f-cja pochodzi z Coyot'a


--------------------
Sygnaturkę ukradli
Go to the top of the page
+Quote Post
Parti
post 23.07.2004, 21:26:10
Post #2





Grupa: Zarejestrowani
Postów: 116
Pomógł: 0
Dołączył: 22.07.2004

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


To jest tylko szkic rozwiazania:

  1. <?php
  2.             case &#092;"\"\": {
  3.                         $result .= &#092;"<font color=\"ff0000\">\"\";
  4.                         while( ( $j < $tokens_count - 1 ) && ( $separators[0][++$j] != &#092;"\"\" ) ) {
  5.  
  6. /* tu wstawic cos takiego:
  7.  jesli nastepny_znak == \"\" to przepisz na wyjscie nastepny_znak i nastepny_nastepny_znak */
  8.  
  9.  
  10.  
  11.  
  12.                           $result .= $tokens[$j].$separators[0][$j];
  13.                         }
  14.                         $result .= $tokens[$j].$separators[0][$j].&#092;"</font>\";
  15.                         break;
  16.                       }
  17.  
  18. ?>


podobnie dla
  1. <?php
  2. case &#092;"'\":
  3. ?>


Ten post edytował Parti 23.07.2004, 21:28:41
Go to the top of the page
+Quote Post
angel2953
post 23.07.2004, 21:37:01
Post #3





Grupa: Zarejestrowani
Postów: 199
Pomógł: 5
Dołączył: 8.07.2004
Skąd: gdynia

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


noo tylko jak to zrobić, bo głowię się z tym od 3 dni i nic nie mogę wymyslić...


--------------------
Sygnaturkę ukradli
Go to the top of the page
+Quote Post
Parti
post 23.07.2004, 22:16:33
Post #4





Grupa: Zarejestrowani
Postów: 116
Pomógł: 0
Dołączył: 22.07.2004

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


Cytat
noo tylko jak to zrobić, bo głowię się z tym od 3 dni i nic nie mogę wymyslić...


Hm.. jak bym mial nad czyms takim 3 dni myslec, to bym sobie sam od podstaw napisal funkcje kolorujaca skladnie.

W ogole ten skrypt jest jakis taki strasznie kiepski, nie podoba mi sie. Nie koloruje liczb zmiennoprzecinkowych. A to juz jest lekkie przegiecie:
  1. <?php
  2. for( $w = 0; $w < count( $PHP_RESERVED ); $w++ ) {
  3. $token = preg_replace( &#092;"/b$PHP_RESERVED[$w]b/i\", \"<font color=\"#0000ff\">$PHP_RESERVED[$w]</font>\", $token );
  4. }
  5. ?>
Go to the top of the page
+Quote Post
angel2953
post 23.07.2004, 22:21:22
Post #5





Grupa: Zarejestrowani
Postów: 199
Pomógł: 5
Dołączył: 8.07.2004
Skąd: gdynia

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


Cytat(Parti @ 2004-07-23 23:16:33)

Cytat
W ogole ten skrypt jest jakis taki strasznie kiepski, nie podoba mi sie. Nie koloruje liczb zmiennoprzecinkowych. A to juz jest lekkie przegiecie:
  1. <?php
  2. for( $w = 0; $w < count( $PHP_RESERVED ); $w++ ) {
  3. $token = preg_replace( &#092;"/b$PHP_RESERVED[$w]b/i\", \"<font color=\"#0000ff\">$PHP_RESERVED[$w]</font>\", $token );
  4. }
  5. ?>

przegięcie?? to tablica słow kluczowych...

  1. <?php
  2.  
  3. //php
  4. $PHP_RESERVED = Array(
  5. &#092;"true\", \"false\", \"class\", \"extends\", \"parent\", \"__sleep\", \"__wakeup\", \"function\",
  6. &#092;"return\", \"static\", \"global\", \"echo\", \"inclue\", \"require\", \"inclue_once\", 
  7. &#092;"require_once\", \"new\", \"delete\", \"null\", \"for\", \"while\", \"do\", \"case\", \"break\",
  8. &#092;"continue\", \"foreach\", \"switch\", \"declare\", \"if\", \"else\", \"elseif\", \"and\", \"or\",
  9. &#092;"xor\", \"array\", \"Array\"
  10. );
  11.  
  12. ?>


Cytat
Hm.. jak bym mial nad czyms takim 3 dni myslec, to bym sobie sam od podstaw napisal funkcje kolorujaca skladnie.

a mógłbyśquestionmark.gif


--------------------
Sygnaturkę ukradli
Go to the top of the page
+Quote Post
Parti
post 23.07.2004, 22:43:48
Post #6





Grupa: Zarejestrowani
Postów: 116
Pomógł: 0
Dołączył: 22.07.2004

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


Cytat
przegięcie?? to tablica słow kluczowych...


No wlasnie. Dla kazdego tokenu sprawdzamy czy nie wystepuje w nim slowo kluczowe w takiej ordynarnej petli. Problem w tym, ze budowanie automatu skonczonego dla wyrazen regularnych jest dosc czasochlonne. Tokenow jest conajmniej tyle co linii, wiecej jesli program zawiera komentarze i stale napisowe. Da sie ten kod mocno zoptymalizowac.

Cytat
a mógłbyśquestionmark.gif


laugh.gif raczej nie bedzie mi sie chcialo, nie lepiej czegos lepszego na sieci poszukac?
Go to the top of the page
+Quote Post
Adam Boduch
post 24.07.2004, 15:29:00
Post #7





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 6.09.2003
Skąd: Wrocław

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


Skorzystaj z funkcji higlight_string() to jest najlepsze rozwiazanie...
Go to the top of the page
+Quote Post
angel2953
post 24.07.2004, 17:03:33
Post #8





Grupa: Zarejestrowani
Postów: 199
Pomógł: 5
Dołączył: 8.07.2004
Skąd: gdynia

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


skorzystałbym gdybym mógł... ale niestety serwer, na którym mam swoją stronę(szkielet strony) niestety ma wyłączoną fukcję podświetlania składni php
Cytat
... ze względów bezpieczeństwa
dlatego szukam jakiejś f-cji do kolorowania składni.

DOPISANE:

Poszukałem na necie i znalazłem takie coś:
  1. class SyntaxColoringPHP {
  2. //Class by Toby Lawrence <tobee(at)playcs(dot)com>
  3.   var $code;
  4.   var $keycol;
  5.   var $manual;
  6.   function highlight( $php ) {
  7.     ob_start();
  8.     @highlight_string( $php );
  9.     $this->code = ob_get_contents();
  10.     ob_end_clean();
  11.     $this->keycol = ini_get(\"highlight.keyword\");
  12.     $this->manual = \"http://www.php.net/manual-lookup.php?lang=pl&pattern=\";
  13.     $this->code = preg_replace( '{([w_]+)(s*</font>)'.'(s*<fonts+color=\"'.$this->keycol.'\">s*()}m', '<a class=\"code\" title=\"Poszukaj f-cji: $1 w manualu php \" href=\"'.$this->manual.'$1\">$1</a>$2$3', $this->code );
  14.     return $this->code;
  15.   }
  16.   function preprocess( $scr ) {
  17.     if( strpos( $scr, \"<?&#092;" ) === false ) {
  18.       $scr = &#092;"<?php\n\".$scr;
  19.     }
  20.     if( strpos( $scr, &#092;"?>\" ) === false ) {
  21.       $scr .= \"?>\";
  22.     }
  23.     return $scr;
  24.  }
  25. }



a użycie w przypadku pliku z znacznikami <?php i ?>:
  1. <?php
  2.  
  3. $highlighter = new SyntaxColoringPHP;
  4. $highlighter->highlight( $text_php );
  5.  
  6. ?>

a użycie w przypadku pliku bez znacznikow <?php i ?> (zostaną dodane):
  1. <?php
  2.  
  3. $highlighter = new SyntaxColoringPHP;
  4. $highlighter->highlight( $highlighter->preprocess( $text_z_php ) );
  5.  
  6. ?>

klasa ziała doskonale... tongue.gif Może się komuś przyda...

Ten post edytował angel2953 25.07.2004, 16:33:27


--------------------
Sygnaturkę ukradli
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: 26.06.2025 - 19:43