На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
Дорогие девчонки! Поздравляем вас с праздником 8 Марта!
msm.ru
Модераторы: Serafim, fatalist
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
    > Подсветка синтаксиса , На php
      Подскажите, как можно реализовать подсветку синтаксиса на php, например есть текст: $text в нем между тэгами [php_code][/php_code] находится php код, который нужно подсветить, так как это сделать?
      Для начала, пусть нужно подсветить зеленым цветом переменные, например $zzz
      Заранее благодарен :)
        В PHP есть функция highlight_string(), которая подсвечивает PHP-код в строке (есть еще функция для файлов). Если тебе нужно организовать субтег, то строку надо еще и пропарсить. Если подождешь немного, я тебе готовый парсер напишу.
          Trustmaster,
          можно сделать как на форуме ( тоесть Регулярными выражениями )
            А вот и код:
            ExpandedWrap disabled
               
              <?
              function parse_subtags($text)
              {
                      $result = $text;
                      eregi('(\[php_code\]).+(\[/php_code\])', $result, $occur);
                      // Проходим по вхождениям
                      for($i = 0; $i < count($occur); $i++)
                      {
                              // Извлекаем код и подготавливаем для замены
                              $code = str_replace('[php_code]', '', $occur[$i]);
                              $code = str_replace('[/php_code]', '', $code);
                              $code = highlight_string($code, true);
                              // Заменяем вхождения
                              $result = str_replace($occur[$i], $code, $result);
                      }
                      return $result;
              }
               
              $code = 'Here is some text<br />
              [php_code]<?
              $foo = "some text here";
              echo $foo;
              $bar[10] = 13;
              echo $bar;
              ?>[/php_code]
              <br />Some more text.<br />
              [php_code]<?
              function test()
              {
                      echo "test";
              }
              ?>[/php_code]<br />
              And here is final text.';
               
              echo parse_subtags($code);
              ?>

            Заметь, что сама подсветка работает только если код заключен в <? ?> или <?php ?>. В str_replace можно вместо '' поставить html-код (например, <div> и </div> соответственно).
            Сообщение отредактировано: Trustmaster -
              Trustmaster, спасибо большое! :)
              А как быть НЕ с php кодом, например с кодом C++?
                А это ты уже у Lepricon'а спрашивай!
                Придется писать свою функцию разметки, поддерживающую правила... Много нелегкой работы, я думаю.
                  Цитата
                  А это ты уже у Lepricon'а спрашивай!
                  Придется писать свою функцию разметки, поддерживающую правила... Много нелегкой работы, я думаю.

                  Trustmaster, это потомушто Lepricon делал подсветку синтаксиса для форума? Если я не ошибаюсь, то на исходниках php код подсвечивается не string_hightlight'ом? Или можно в этой функции цвета менять?
                    Цвета для встроенной подсветки в PHP задаются в phi.ini или при помощи ф-и ini_set(). Вот кусок php.ini:
                    Цитата
                    ; Colors for Syntax Highlighting mode. Anything that's acceptable in
                    ; <font color="??????"> would work.
                    ;highlight.string = #DD0000
                    ;highlight.comment = #FF9900
                    ;highlight.keyword = #007700
                    ;highlight.bg = #FFFFFF
                    ;highlight.default = #0000BB
                    ;highlight.html = #000000

                    Но если тебе нужна многоязыковая поддержка, то придется писать свой код. Реализовать это лучше при помощи str_replace() или регулярных выражений (регэкспы, кстати, в несколько раз медленнее), заменяя, например "function" на "<b>function</b>":
                    ExpandedWrap disabled
                      $code = str_replace('function', '<b>function</b>', $code);

                    Это легко, но основная работа - разработка правил и ключевых слов.
                    Ничего сложного, в принципе нет.
                      Обычные str_replace'ы не панацея. Ибо если в выводе есть слово function, то его подсвечивать не надо, а если в программном коде, то - надо. В РНР не всегда $var должно подсвечиваться. Точнее не должно подсвечиваться, когда переменная заключена в одинарные скобки. Ещё есть парочка нюансов. Нуно полный анализ текста производить;))
                        Короче-говоря, нужно вспоминать университетскую задачку "Синтаксический анализатор". :D
                          Именно так. На PHP, к слову, это гораздо легче. Мне, например, приходилось делать подсветку в Pascal'е, где нет даже функций для работы с подстроками и регэкспами.
                            Цитата
                            Короче-говоря, нужно вспоминать университетскую задачку "Синтаксический анализатор"

                            А если я еще школьник...

                            Примерно понятно, буду разбираться :)
                              Цитата
                              p_kolya, 13.08.04, 06:17
                              А как быть НЕ с php кодом, например с кодом C++?

                              форматирование в Memo (сообщение #268524)
                                myaut, ты не понял. Надо разметку для разных языков сделать (в том числе и C), но на PHP.
                                Лучше все-таки сделать универсальный код, то есть от "языка" зависит только то, какой словарь загрузить (проинклудить или что-то типа этого), а сам код разметки - универсальный. То есть, хранить ключевые слова по группам в массивах, и проходить по ним в цикле. А строковые константы вырезать, выделять одним цветом, и вставлять обратно (чтобы не было ошибок с разметкой строковых констант).
                                  Цитата
                                  SergeS, 12.08.04, 21:15
                                  можно сделать как на форуме ( тоесть Регулярными выражениями )


                                  В общем случае что лучше: регулярные выражения или "ручной парсинг" а-ля ТрустМастер?

                                  1-е быстрее, но 2-е наверное более качественное?
                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                  0 пользователей:


                                  Рейтинг@Mail.ru
                                  [ Script execution time: 0,0328 ]   [ 15 queries used ]   [ Generated: 13.03.25, 17:58 GMT ]