Forum Webscript.Ru

Общие => Веб-технологии => Тема начата: Secandr от 23 Января 2003, 21:48:56

Название: Тег code
Отправлено: Secandr от 23 Января 2003, 21:48:56
У меня вот какая проблема: я понятия не имею как сделать тег [ code ][/ code ] в своём форуме.
Как заменить [ b ]txt[/ b ] на txt я знаю, а здесь проблема другая: Мне нужно заменить тег [ code ] на
, но сделать это так, чтобы теги и спец символы внутри [ code ][/ code ] остались без изменения.

Тоесть нужно заменить
[ b ][ i ]bold[ /i ][ /b ] [ code ][ b ][ i ]bold[ /i ][ /b ] - bold and italic text [ /code ]
На
bold
[ b ][ i ]bold[ /i ][ /b ] - bold and italic text 


P.S. Пробелов в тегах нет.
Название: Тег code
Отправлено: Maniac от 23 Января 2003, 23:25:48
А в чем проблема?
Сначала htmlspecialchars на то, что внутри code, затем str_relpace на скобки.
Название: Тег code
Отправлено: Secandr от 23 Января 2003, 23:52:34
А можно по подробнее? И желательно на перле.
Название: Тег code
Отправлено: Maniac от 24 Января 2003, 17:27:46
Цитировать
перле

На перле не могу (это тебе к NeoNox :) ) - его почти забыл. Могу на PHP.
Название: Тег code
Отправлено: YA от 24 Января 2003, 17:37:59
my $text=\'[ b ][ i ]bold[ /i ][ /b ] [ code ][ b ][ i ]bold[ /i ][ /b ] - bold and italic text [ /code ]\';
for ($text)
   {
   s/&/&/g;
   s/   s/>/>/g;
   s/\\[(\\/?[a-z]+)\\]/<$1>/ig;
   }

... впрочем, можно еще много проверок ввести.


---
Можно -> в Perl
Название: Тег code
Отправлено: DELirium от 24 Января 2003, 20:14:54
Приведённый код не работает, или у меня в конец кривые руки.

Вообще я написал немного кода и он вполне великолепно работает:
$in=текст


$in2=$in
while ($in2 =~ s|\\*?)\'\\]([^\\[\\]]*?)\\[\\/url\\]|$2|g){}# Проверка на то написанно ли всё правильно.
while ($in2 =~ s|\\[(\\w)\\]([^\\[\\]]*?)\\[\\/\\1\\]|$2|g){}# Проверка на то написанно ли всё правильно.
if (($in2 =~ m/\\[(b|i|u|quote|code|url|mail)\\]/) || ($in2 =~ m/\\[\\/(b|i|u|quote|code|url|mail)\\]/))
         {print"-----\\n$in2\\n-----";$in=\'\'}


         $in =~ s/\\[b\\]//g;$in =~ s/\\[\\/b\\]/<\\/b>/g;
         $in =~ s/\\[u\\]//g;$in =~ s/\\[\\/u\\]/<\\/u>/g;
         $in =~ s/\\[i\\]//g;$in =~ s/\\[\\/i\\]/<\\/i>/g;
         $in =~ s/\\[i\\]//g;$in =~ s/\\[\\/i\\]/<\\/i>/g;
         $in =~ s|\\[mail\\]([^\\[\\]]*?)\\[\\/mail]|$1|g;
         $in =~ s|\\[url=\'([^\']*?)\'\\]([^\\[\\]]*?)\\[\\/url]|$2|g;
         $in =~ s/\\[quote\\]/\\\\\\
/g;
         $in =~ s/\\[\\/quote\\]/\\<\\/td\\>\\<\\/tr\\>\\<\\/table\\>/g;


Конечно "немного" убого, но работате.
Проблема в другом:
Необходимо чтобы внутри тега code вообще ничего не менялось. А если я добавлю строку:

$in =~ s/\\[code\\]/
/g;$in =~ s/\\[\\/code\\]/<\\/pre>/g;

то внутри тега code все спец символы заменятся, а мне этого совершенно не надо :(


p.s. А может у скобок [] есть альтернативное написание, как у< => < (http://\'([^\')
Название: Тег code
Отправлено: Secandr от 24 Января 2003, 20:27:34
как плохо работать двоим за одним компом :(
Название: Тег code
Отправлено: dymka от 25 Января 2003, 14:33:13
я делал подобную фишку но немного по-другому:
я создавал хеш-массив преобразований:
code=>\'
VALUE
\',
url => \'VALUE\'
итп...
а потом вызывал функцию, которая все что внутри тегов
[ url ]http://some_host[ /url ]
преобразовывало согласно правилам...
если нужно могу поискать и попробывать прогнать твой примерчик, если пройдет то выложу

P.S.: сорри, немного неправильно понял проблему :) бум думать, мне такое тоже пригодится
Название: Тег code
Отправлено: Secandr от 25 Января 2003, 15:47:57
Я придумал:
я внутри блока [ code]заменю все [ на << Тогда они в дальнейшем не будут обрабатываться.
А после обработки заменю << на [ вот и всё.
Таким образом, у меня в теге коде не будет каких либо изменений
Всё гениальное просто.:)
Название: Тег code
Отправлено: YA от 27 Января 2003, 08:40:33
DELirium, а чего не работает? Если внутри [] допускаются пробелы, добавь после \\[ и перед \\] \\s*
Название: Тег code
Отправлено: DELirium от 27 Января 2003, 16:56:46
Это вообще Secandr под моим ником писал :)
А так всё сделали.