
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.117.155.114] |
![]() |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Подскажите, как можно реализовать подсветку синтаксиса на php, например есть текст: $text в нем между тэгами [php_code][/php_code] находится php код, который нужно подсветить, так как это сделать?
Для начала, пусть нужно подсветить зеленым цветом переменные, например $zzz Заранее благодарен ![]() |
Сообщ.
#2
,
|
|
|
В PHP есть функция highlight_string(), которая подсвечивает PHP-код в строке (есть еще функция для файлов). Если тебе нужно организовать субтег, то строку надо еще и пропарсить. Если подождешь немного, я тебе готовый парсер напишу.
|
Сообщ.
#3
,
|
|
|
Trustmaster,
можно сделать как на форуме ( тоесть Регулярными выражениями ) |
Сообщ.
#4
,
|
|
|
А вот и код:
![]() ![]() <? 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> соответственно). |
Сообщ.
#5
,
|
|
|
Trustmaster, спасибо большое!
![]() А как быть НЕ с php кодом, например с кодом C++? |
Сообщ.
#6
,
|
|
|
А это ты уже у Lepricon'а спрашивай!
Придется писать свою функцию разметки, поддерживающую правила... Много нелегкой работы, я думаю. |
Сообщ.
#7
,
|
|
|
Цитата А это ты уже у Lepricon'а спрашивай! Придется писать свою функцию разметки, поддерживающую правила... Много нелегкой работы, я думаю. Trustmaster, это потомушто Lepricon делал подсветку синтаксиса для форума? Если я не ошибаюсь, то на исходниках php код подсвечивается не string_hightlight'ом? Или можно в этой функции цвета менять? |
Сообщ.
#8
,
|
|
|
Цвета для встроенной подсветки в 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>": ![]() ![]() $code = str_replace('function', '<b>function</b>', $code); Это легко, но основная работа - разработка правил и ключевых слов. Ничего сложного, в принципе нет. |
Сообщ.
#9
,
|
|
|
Обычные str_replace'ы не панацея. Ибо если в выводе есть слово function, то его подсвечивать не надо, а если в программном коде, то - надо. В РНР не всегда $var должно подсвечиваться. Точнее не должно подсвечиваться, когда переменная заключена в одинарные скобки. Ещё есть парочка нюансов. Нуно полный анализ текста производить;))
|
Сообщ.
#10
,
|
|
|
Короче-говоря, нужно вспоминать университетскую задачку "Синтаксический анализатор".
![]() |
Сообщ.
#11
,
|
|
|
Именно так. На PHP, к слову, это гораздо легче. Мне, например, приходилось делать подсветку в Pascal'е, где нет даже функций для работы с подстроками и регэкспами.
|
Сообщ.
#12
,
|
|
|
Цитата Короче-говоря, нужно вспоминать университетскую задачку "Синтаксический анализатор" А если я еще школьник... Примерно понятно, буду разбираться ![]() |
Сообщ.
#13
,
|
|
|
Цитата p_kolya, 13.08.04, 06:17 А как быть НЕ с php кодом, например с кодом C++? форматирование в Memo (сообщение #268524) |
Сообщ.
#14
,
|
|
|
myaut, ты не понял. Надо разметку для разных языков сделать (в том числе и C), но на PHP.
Лучше все-таки сделать универсальный код, то есть от "языка" зависит только то, какой словарь загрузить (проинклудить или что-то типа этого), а сам код разметки - универсальный. То есть, хранить ключевые слова по группам в массивах, и проходить по ним в цикле. А строковые константы вырезать, выделять одним цветом, и вставлять обратно (чтобы не было ошибок с разметкой строковых констант). |
Сообщ.
#15
,
|
|
|
Цитата SergeS, 12.08.04, 21:15 можно сделать как на форуме ( тоесть Регулярными выражениями ) В общем случае что лучше: регулярные выражения или "ручной парсинг" а-ля ТрустМастер? 1-е быстрее, но 2-е наверное более качественное? |