Собственные тэги, как у этого форума.

TsarAlex

Новичок
Собственные тэги, как у этого форума.

Вот в этом форуме можно в сообщение URL используя условние тэги. Мне нужно сделать нечто подобное. Тут ничего сложного нет, вот только с таблицами проблемно. Нужно чтобы было все так как описано ниже. Может кто-то уже делал что-то подобное. Буду рад любым намекам и замечаниям, а также URL

Открыввающий тэг

Закрывающий
таблица (см. два следующих тега). Таблица подчиняется тем же правилам выравнивания, что и текст. Если задано выравнивание по ширине, то таблица обязательно занимает всю ширину, ширина ее столбцов выбирается на основе содержимого. При остальных установках выравнивания действуют
Пример:
A35Капюшон15
C18Стаканчик3
T377Стол28

[tr marked]
[td]Артикул[/td]
[td]Название[/td]
[td]Цена, руб[/td]
[/tr]

В тэг таблицы не могут быть вложены следующие теги:
- page
- td
- topic
- table
----------------------
Открывающий тэг:
[tr <marked >]
тэг обязательно вложен в
.
marked - опционально выделяет строку
Закрывающий
[/tr] строка таблицы.

В тэг строки не могут быть вложены следующие теги:
- tr

----------------------
Открывающий тэг
[td <marked > <#>]
тэг обязательно вложен в . marked - опционально выделяет ячейку; # - ширна ячейки в пикселах (100px) или процентах (30%) Закрывающий [/td] ячейка строки таблицы. За соответствие заданной ширины отображаемой отвечает растеризатор HTML, значения ширины каждой ячейки ему передаются без иземенений. В тэг ячейки не могут быть вложены следующие теги: - tr - td
 

NEK

Guest
Re: Собственные тэги, как у этого форума.

Автор оригинала: TsarAlex
Вот в этом форуме можно в сообщение URL используя условние тэги. Мне нужно сделать нечто подобное. Тут ничего сложного нет, вот только с таблицами проблемно. Нужно чтобы было все так как описано ниже. Может кто-то уже делал что-то подобное. Буду рад любым намекам и замечаниям, а также URL
Кому это надо ??? Попробуй найти хоть одного
нормально человека который согласится набирать
такое ??? Надо быть маньяком ???
Разреши пару тегов
Код:
 [marced].
 

Popoff

popoff.donetsk.ua
Используй теорию автоматов :)
Простейший пример: у тебя есть переменная, например, state, в которой хранится состояние твоего автомата. Далее говоришь, что состояния могут быть следующими:
0. вне таблицы
1. внутри [table .... (когда парсишь параметры самой таблицы)
2. внутри
... - разбираем содержимое ячейки таблицы
Далее просматриваешь свой текст от начала к концу. В начале считаешь, что твой автомат находится в состоянии 0 (вне таблицы). Если в этом состоянии ты находишь тег, например, [tr], то выдаешь ошибку, что tr не может быть за пределами таблицы. Если находишь последовательность [table, то переводишь автомат в состояние 1 и разбираешь параметры таблицы. Если в состоянии 1 тебе встретился символ [, то выдаешь ошибку, что тег не был закрыт. Если в состоянии 1 тебе встретится символ ], то считаешь, что тег таблицы закончился, поэтому переводим автомат в состояние 2. В состоянии 2 не может встретиться тег
и не может встретиться тег [td]. Возможно, в cостоянии 2 не может встретиться вообще ничего, кроме . И так далее, разрабатіваешь действия для каждого состояния. Обычно такие автоматы реализуются в виде большого цикла по всем символам твоего текста, начиная с первого и до конца. Внутри цикла - один большой switch(state), который в зависимости от состояния, в котором находится твой автомат, выбирает нужное тебе действие :)
.... (когда парсишь содержимое таблицы)
3. внутри [tr ... --- разбираем параметры строки таблицы
4. ... - разбираем содержимое строки таблицы 5. [td ... - разбираем параметры ячейки таблицы 6.
 

TsarAlex

Новичок
Re: Re: Собственные тэги, как у этого форума.

Автор оригинала: NEK
Кому это надо ??? Попробуй найти хоть одного
нормально человека который согласится набирать
такое ??? Надо быть маньяком ???
Разреши пару тегов
Код:
 [marced]. [/QUOTE]
Есть заказчики. Которые хотят чтобы было так! Причем тэгов нужно много. Проблемы у меня возникли только с таблицами.
 

TsarAlex

Новичок
Автор оригинала: Popoff
Используй теорию автоматов :)
Простейший пример: у тебя есть переменная, например, state, в которой хранится состояние твоего автомата. Далее говоришь, что состояния могут быть следующими:
0. вне таблицы
1. внутри [table .... (когда парсишь параметры самой таблицы)
2. внутри
... - разбираем содержимое ячейки таблицы
Далее просматриваешь свой текст от начала к концу. В начале считаешь, что твой автомат находится в состоянии 0 (вне таблицы). Если в этом состоянии ты находишь тег, например, [tr], то выдаешь ошибку, что tr не может быть за пределами таблицы. Если находишь последовательность [table, то переводишь автомат в состояние 1 и разбираешь параметры таблицы. Если в состоянии 1 тебе встретился символ [, то выдаешь ошибку, что тег не был закрыт. Если в состоянии 1 тебе встретится символ ], то считаешь, что тег таблицы закончился, поэтому переводим автомат в состояние 2. В состоянии 2 не может встретиться тег
и не может встретиться тег [td]. Возможно, в cостоянии 2 не может встретиться вообще ничего, кроме . И так далее, разрабатіваешь действия для каждого состояния. Обычно такие автоматы реализуются в виде большого цикла по всем символам твоего текста, начиная с первого и до конца. Внутри цикла - один большой switch(state), который в зависимости от состояния, в котором находится твой автомат, выбирает нужное тебе действие :)
.... (когда парсишь содержимое таблицы)
3. внутри [tr ... --- разбираем параметры строки таблицы
4. ... - разбираем содержимое строки таблицы 5. [td ... - разбираем параметры ячейки таблицы 6.
Там предполагаются большие статьи. Такое не совсем подходит. Может есть более оптимальный способ?
 

Popoff

popoff.donetsk.ua
В общем-то это не плохой способ. В любом случае тебе придется перебрать все символы этого текста, другой вопрос, сделают это функции пхп или это сделает твоя программа.

А вопрос об оптимальности, наверное, уже можно в фак включать: ты утверждаешь, что этот способ не оптимален. Каким способом ты это определил?
 

Popoff

popoff.donetsk.ua
Кстати, этот способ может быть еще намного оптимальнее, чем когда ты по отдельности ищешь каждый тег: таким способом ты сможешь сделать все преобразования за один проход по всему тексту.
 

NEK

Guest
А знаете можно еще регулярками рекурсивнообрабатывать,
что-то такое:
PHP:
function recurs($r){  
 $st=preg_match("/([table][tr]([td]?+[\/td])[\/tr][\/table])/",$r,$x);
  //нашли следующую таблицу
  ...  // разбираем [td]?+[\/td]
  recurs($other_table); // если есть еще таблицы
  return str_replace($x[1],$new_code_to_replace);
}
Вроде все
 

Popoff

popoff.donetsk.ua
Хороший способ :) Осталось только в него добавить возможность добавления свойств к тегам :)

Если вдруг кто реализует двумя способами, интересно будет узнать, как же ш все-таки быстрее :))
 

NEK

Guest
Ну покрайней мере это универсальнее - ведь менять надо лишь
1 рег. А во вторых насколько я полял это все разбираться будет
всего 1 раз при занесении в базу, если слишком долко кинуть в
register_shutdown_function.
 

Popoff

popoff.donetsk.ua
Ну покрайней мере это универсальнее - ведь менять надо лишь 1 рег
Ага, а потом еще учесть, что свойств много и они могут быть или не быть и быть расположены в любом порядке: рег на страницу выйдет - попробуй в него через год добавить еще пару свойств... %) А в случае с автоматами все описание языка, которое может поменяться, очень просто можно вынести за пределы самого автомата и написать документацию, какой массив что означает. Тогда изменять язык сможет даже человек, плохо знакомый с Вашей программой и не понимающий, что это такое, автоматы и регулярные выражения...

А вообще вопрос: что проще отладить рекурсивную функцию с огроменным регулярным выражением внутри или обычный цикл с огроменным switch-ем внутри?
 

NEK

Guest
Автор оригинала: Popoff
А вообще вопрос: что проще отладить рекурсивную функцию с огроменным регулярным выражением внутри или обычный цикл с огроменным switch-ем внутри?
А вот мне интересно как можно за один цикл без возврата
пройти:

OTHER_TEXT
Все равно придется рекурсивно влазить и разбирать код !!!
 

Popoff

popoff.donetsk.ua
Не придется :)
Рекурсия - это способ хранения информации о том, что происходит за пределами текущего вызова функции. Точно так же ты можешь добавить в автомат состояние, в котором ты всю эту информацию будешь хранить.

Думаю, для таблиц может понадобиться знать только текущую глубину вложенности, да и то, только для того, что бы в конце можно было сказать, что у вас не все теги закрыты.

А вообще, если бы все было так, как в твоем примере, то все можно было бы решить обычным str_replace. :)
 

TsarAlex

Новичок
Помогите разобраться в коде форума phpBB. Что есть UID в bbcode.php?
Чего-то никак не могу догнать, ведь фактически это случайная величина.
 

Popoff

popoff.donetsk.ua
2TsarAlex: Это другой вопрос, который потребует другие ответы, не связанные с вопросом данной темы. Если ты хочешь задать другой вопрос, то создай новую тему.
 

TsarAlex

Новичок
Речь о своих тэгах. И прежде чем изобретать что-то свое, хотелось бы узнать как его реализовали другие.
 

TsarAlex

Новичок
И на том спасибо, вот только ситуация такая что не до улыбок мне :(
 
Сверху