Ерунда какя-то. Вроде, постил последний вариант функции, а моего сообщения не видно
последний вариант
colorer.php:
Код:
<?php
function colorer($text){
// слова с < > # = ' обрабатываются отдельно!
// слова
$words[0] = 'CLOSE-FILE CREATE-FILE-SHARED CREATE-FILE DELETE-FILE FILE-POSITION FILE-SIZE FORTH-WORDLIST GET-CURRENT GET-ORDER INCLUDE-FILE OPEN-FILE-SHARED OPEN-FILE READ-FILE READ-LINE REPOSITION-FILE RESIZE-FILE SEARCH-WORDLIST SET-CURRENT SET-ORDER SOURCE-ID TO-LOG WRITE-FILE WRITE-LINE';
$words[] = '0</ 0<>/ 0= 0! << >> -> 1+ 2+ 1- 2- D+ D. D0= D< D>S S>D C! C, C/L C@ C@ >BODY >IN >NUMBER >R -ROT -TRAILING <# <> +! ", */ #>';
$words[] = '#S #TIB */MOD /MOD 2/ 2>R FM/MOD R/O R/W SM/REM U>D UM/MOD W/O';
$words[] = '! .S (.") (ABORT") * + , - . .0 ?COMP 2DROP 2DUP 2LITERAL 2OVER 2R> 2R@ 2SWAP ?DUP @ ABORT ABS ACCEPT ALIGN ALIGNED ALLOCATE ALLOT ALSO AND ASCIIZ> AT BASE BETWEEN BL BLK BUFFER: BYE CATCH CELL CELL+ CELL- CELLS CHAR CHAR+ CHARS CLITERAL CMOVE CMOVE> COMPARE CONTEXT COUNT CR CURRENT DABS DECIMAL DEFER DEFINITIONS DEPTH DIGIT DNEGATE DP DROP DUMP DUP EKEY EKEY? EMIT ENVIRONMENT? END-CODE ERASE EXECUTE EXIT EVALUATE FALSE FIELD FILL FIND FORTH FREE HANDLER HEADER HERE HEX HIDE HLD HOLD IMMEDIATE INCLUDED INTERPRET INVERT IS KEY KEY? LATEST LEAVE LITERAL LSHIFT M* MAX MIN MOD MOVE NAME> NEGATE NIP NLIST NOOP NOT ONLY OR ORDER OVER PAD PARSE PICK PREVIOUS QUIT R0 ROLL R> R@ RDROP RECURSE REFILL RESIZE ROT RP! RP@ RSHIFT S0 SEARCH SIGN SKIP SLITERAL SMUDGE SOURCE SP! SP@ SPACE SPACES STATE SWAP THROW TIB TRUE TUCK TYPE U. U/ U< U> UM* UMOD W! W, W@ WARNING WITHIN WORD WORDLIST WORDS XOR COMPILE INCLUDE VOCS NextWord SFIND HALT OK LT LTL';
$words[] = 'F! F* F+ F. F, F- F/ F< F= F> F@ FABORT FABS FALIGN FALIGNED FDEPTH FDROP FDUP FEXP FLN FLG FLITERAL FLOATS FMAX FMIN FNEGATE';
$words[] = '!nt @nt br+ br- br0 ddo decode-2int decode-int decode-phys decode-string device-name DICTLIST encode+ encode-2int encode-bytes encode-int encode-phys encode-string end0 end1 ex ex+ ex- ex0 external finish-device headers if+ if- if0 my-self NAMEBASE new-device PROPERTY rp TVOCABULARY';
$words[] = 'OF ENDOF CASE END-CASE ENDCASE IF ELSE THEN BEGIN WHILE REPEAT BEGIN UNTIL AGAIN RECURSE ?DO DO +LOOP LOOP UNLOOP I J LEAVE DOES> {{ }}';
$words[] = ': ... WINAPI: CREATE VARIABLE USER CONSTANT VOCABULARY VECT VALUE FVALUE -- CODE REQUIRE';
$words[] = '> < = \\\' #';
// color_o[] -- открытие выделения (можно добавить не только цвет, но и bold и italic)
// color_c[] -- закрытие выделения
$color_о[0] = '<font color=#000088>';$color_c[0] = '</font>';
$color_о[] = '<font color=#008800>'; $color_c[] = '</font>';
$color_о[] = '<font color=#880000>'; $color_c[] = '</font>';
$color_о[] = '<font color=#0000FF>'; $color_c[] = '</font>';
$color_о[] = '<font color=#00FF00>'; $color_c[] = '</font>';
$color_о[] = '<font color=#FF0000>'; $color_c[] = '</font>';
$color_о[] = '<font color=#0000FF><s>'; $color_c[] = '</s></font>';
$color_о[] = '<font color=#00FF00><i>'; $color_c[] = '</i></font>';
$color_о[] = '<font color=#FFFF00><b>'; $color_c[] = '</b></font>';
// замена через через unix-регулярные выражения
// замена управляющих символов
$text = str_replace('>', '>', $text);
$text = str_replace('<', '<', $text);
$text = str_replace('\\'.chr(39), chr(39), $text);
// обезьянничаем regexp из ббкода
$text = preg_replace(
"#\[colorer\](.*?)\[/colorer\]#si",
"<pre>\\1</pre>", $text);
// строки
$text = preg_replace("#S.\"(.*?).\"#si", "<font color=orange>S\"\\1\"</font>", $text);
$text = preg_replace("#\..\"(.*?).\"#si", "<font color=orange>.\"\\1\"</font>", $text);
// коментарий, начинающийся с /
// $text = preg_replace("#\n\/ .* \n"#si", "<font color=darkyellow>\\1</font>", $text);
// $text = preg_replace("#(0-9A-F)#si", "<font color=green>\\1</font>", $text);
// числа (не работают нормально!)
// $text = preg_replace("#(\d|A|B|C|D|E|F).\s#si", " <font color=lightgreen>\\1</font> ", $text);
// убрать лишние слеши
$text = str_replace('\"', '"', $text);
$text = str_replace('\\\'', '\'', $text);
// собственно расцвечивание
$w=0; // номер массива слов и цвета для расцветки
while (isset($words[$w])){ // пока есть слова:
$xx = $words[$w];
// замена управляющих символов html в расцвечиваемых словах
$xx = str_replace('>', '>', $xx);
$xx = str_replace('<', '<', $xx);
$mas = split((chr(32)),$xx); // вытаскиваем слова в массив
// echo "<hr>".$mas[1].$mas[2].$mas[3];
$i=1;
while (isset($mas[$i])){ // пока есть слова, заменяем:
// для слов окруженных пробелами
$text = str_replace(" $mas[$i] "," $color_о[$w]$mas[$i]$color_c[$w] ",$text);
// для слов в конце строки
$text = str_replace(" $mas[$i]".'\n'," $color_о[$w]$mas[$i]$color_c[$w]".'\n',$text);
// для слов в начале строки
$text = str_replace('\n'."$mas[$i] ",'\n'."$color_о[$w]$mas[$i]$color_c[$w] ",$text);
// для одиночных слов
$text= str_replace('\n'."$mas[$i]\n",'\n'."$color_о[$w]$mas[$i]$color_c[$w]".'\n',$text);
$i++;
// /^stroka$/ - строка с началом и концом
//$text = str_replace(" $mas[$i] "," $color_о[$w]$mas[$i]$color_c[$w] ",$text);
};
$w++;
};
$text = str_replace(" CREATE "," <font color=#FF0000>CREATE</font> ",$text);
// $text = str_replace(' # ', '<b>#</b>', $text);
return ($text);};
?>
Попробовать, как он работает, можно на
http://fforum.winglion.ru/colorer/test.php
в окошко вводится тестовый код, окруженный тегами [colorer] [/colorer]
и получается некий результат