problem z " i "

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ś:

<font color="#007700">$text</font> = <font color="#ff0000">"jakiś sobie tekst w całości pokolorowany"</font>;

to mi go poprawnie koloruje ale jeśli w kodzie znajdzie się \" to już zaczynają sie schodzy:

<font color="#007700">$text</font> = <font color="#ff0000">"jakiś sobie tekst pokolorowany \"</font>ten tekst nie jest pokolorowany \<font color="#ff0000">"a ten już jest"</font>;

i jak to teraz poprawić by ignorował znaki " poprzedzone \ ????
oto f-cja:

function PHPHighlight($body) {
      global $PHP_RESERVED;
      //wyodrębnienie zawartosci calego tekstu z wnetrza &lt;php&gt;&lt;/php&gt;
      preg_match_all( "|&lt;php&gt;(.*?)&lt;/php&gt;|si", $body, $matched );
      for( $i = 0; $i &lt; count( $matched[1] ); $i++ ) {
        //usuwanie znacznikow HTML
        $html = htmlspecialchars( $matched[1][$i], ENT_NOQUOTES );
        $html = str_replace( " ", "&amp;nbsp;", $html );
        //dzielenie tokenów komentarzy i stringów # /* */ // ' " ` '
        $tokens = preg_split( "(\#|/\*|\*/|'|".'"'."|`|\\n|//)", $html );
        $tokens_count = count( $tokens );
        preg_match_all( "(\#|/\*|\*/|'|".'"'."|`|\\n|//)", $html, $separators );
        $result = "";
        //teraz dla tokenów jazda !!
        for( $j = 0; $j &lt; $tokens_count; $j++ ) {
          //pogrubianie slów kluczowych
          $token = $tokens[$j];
          for( $w = 0; $w &lt; count( $PHP_RESERVED ); $w++ ) {
            $token = preg_replace( "/\b$PHP_RESERVED[$w]\b/i", "&lt;font color=\"#0000ff\"&gt;$PHP_RESERVED[$w]&lt;/font&gt;", $token );
          }
          //kolorowanie liczb
          $token = preg_replace( "/\b([0-9]+)\b/i", "&lt;font color=\"#BBAA11\"&gt;\\1&lt;/font&gt;", $token );
          //kolorowanie zmiennych
          $token = preg_replace( "/(\\$[0-9a-zA-Z_]+)/i", "&lt;font color=\"#007700\"&gt;\\1&lt;/font&gt;", $token );
          $token = preg_replace( "/(\\$\\{.+\\})/i", "&lt;font color=\"#ff00ff\"&gt;\\1&lt;/font&gt;", $token );
          $result .= $token;
          //sprawdzanie komentarzy: komentarze i stringi sa parsowane BEZ sprawdzania słów kluczowych wewnątrz
          switch( $separators[0][$j] ) {
            case "/*": {
                         $result .= "&lt;font color=\"c0c0c0\"&gt;&lt;i&gt;/*";
                         while( ( $j &lt; $tokens_count - 1 ) &amp;&amp; ( $separators[0][++$j] != "*/" ) ) {
                           $result .= $tokens[$j].$separators[0][$j];
                         }
                         $result .= $tokens[$j].$separators[0][$j]."&lt;/i&gt;&lt;/font&gt;";
                         break;
                       }
            case "#": {
                        $result .= "&lt;font color=\"c0c0c0\"&gt;&lt;i&gt;#";
                        while( ( $j &lt; $tokens_count - 1 ) &amp;&amp; ( $separators[0][++$j] != "\n" ) ) {
                          $result .= $tokens[$j].$separators[0][$j];
                        }
                        $result .= $tokens[$j].$separators[0][$j]."&lt;/i&gt;&lt;/font&gt;";
                        break;
                      }
            case "//": {
                         $result .= "&lt;font color=\"c0c0c0\"&gt;&lt;i&gt;//";
                         while( ( $j &lt; $tokens_count - 1 ) &amp;&amp; ( $separators[0][++$j] != "\n" ) ) {
                           $result .= $tokens[$j].$separators[0][$j];
                         }
                         $result .= $tokens[$j].$separators[0][$j]."&lt;/i&gt;&lt;/font&gt;";
                         break;
                       }
            case "'": {
                        $result .= "&lt;font color=\"ff0000\"&gt;'";
                        while( ( $j &lt; $tokens_count - 1 ) &amp;&amp; ( $separators[0][++$j] != "'" ) ) {
                          $result .= $tokens[$j].$separators[0][$j];
                        }
                        $result .= $tokens[$j].$separators[0][$j]."&lt;/font&gt;";
                        break;
                      }
            case "\"": {
                        $result .= "&lt;font color=\"ff0000\"&gt;\"";
                        while( ( $j &lt; $tokens_count - 1 ) &amp;&amp; ( $separators[0][++$j] != "\"" ) ) {
                          $result .= $tokens[$j].$separators[0][$j];
                        }
                        $result .= $tokens[$j].$separators[0][$j]."&lt;/font&gt;";
                        break;
                      }
            case "\`": {
                         $result .= "&lt;font color=\"ff0000\"&gt;\`";
                         while( ( $j &lt; $tokens_count - 1 ) &amp;&amp; ( $separators[0][++$j] != "\`" ) &amp;&amp; ( $separators[0][$j] != "\n" ) ) {
                           $result .= $tokens[$j].$separators[0][$j];
                         }
                         $result .= $tokens[$j].$separators[0][$j]."&lt;/font&gt;";
                         break;
                       } 
            default: $result .= $separators[0][$j];
          }
        }
        $body = str_replace('&lt;php&gt;' . $matched[1][$i] . '&lt;/php&gt;', '&lt;font face="Courier New"&gt;' . $result. '&lt;/font&gt;', $body);
        $body = str_replace('&amp;amp;', '&amp;', $body);
      }
      return $body;
}
0

Huh... jezeli chodzi ci o kolorowanie skladnii PHP to po co sie meczysz? PHP udostepnia do tego odpowiednie funkcje: higlight_string() oraz higlight_file().

0

w php tak... ale niestety niektóre servery maja to zablokowane

...ze względów bezpieczeństwa
więc nie pozostaje nic innego jak napisani (lub ściągnięcie) funkcji...

Poszukałem na necie i znalazłem takie coś:

    class SyntaxColoringPHP {
        //Class by Toby Lawrence <tobee(at)playcs(dot)com>
        function highlight( $php ) {
            ob_start();
            @highlight_string( $php );
            $this->code = ob_get_contents();
            ob_end_clean();
            $this->keycol = ini_get("highlight.keyword");
            $this->manual = "http://www.php.net/manual-lookup.php?lang=pl&amp;pattern=";
            $this->code = preg_replace( '{([\w_]+)(\s*</font>)'.'(\s*<font\s+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 );
            return $this->code;
        }
        function preprocess( $scr ) {
            if( strpos( $scr, "<?" ) === false ) {
                $scr = "<?php\n".$scr;
            }
            if( strpos( $scr, "?>" ) === false ) {
                $scr .= "?>";
            }
            return $scr;
        }
    }

a użycie w przypadku pliku z znacznikami <?php i ?>:

$highlighter = new SyntaxColoringPHP;
$highlighter->highlight( $text_php );

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

0

No ale to tez korzysta z higlight_string().

0

wiem, ale to na serwie działa, czyli widocznie tylko higlight_file() mają zablokowane :P:P:P

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0