Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: problem z " i \"
Forum PHP.pl > Forum > Gotowe rozwiązania
angel2953
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
Parti
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. ?>
angel2953
noo tylko jak to zrobić, bo głowię się z tym od 3 dni i nic nie mogę wymyslić...
Parti
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. ?>
angel2953
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
Parti
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?
Adam Boduch
Skorzystaj z funkcji higlight_string() to jest najlepsze rozwiazanie...
angel2953
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...
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-2024 Invision Power Services, Inc.