Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.01.2012, 17:41
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Парсинг BBcode
Пишу сейчас, вернее уже дописываю парсинг BBcode регой.

Вид реги не имеет значения, суть такова:

Текст
[B]aaaa [B] bbbb[/B] aaa[/B]
парсится регой так:
Сначала находиться:
[B] bbbb[/B]
, затем нужно рекурсивно вызвать регу снова и она найдет:
[B]aaaa <b> bbbb</b> aaa[/B]


Меня всё устраивает, но выглядит идея как-то громоздко, хотя сохраняется вложенность, если таковая имеется и всякие там [color = red\]bububu[/color] не проблема, ведь мы получаем весь BBcode и можем потом с ним делать что хотим.

Раньше парсил быстрее, но раздельно начало и конец, но решение получалось какое-то заумное и разрозненное.

Есть идеи как можно быстрее парсить BBcode, нежели рекурсией?

ps: По BBcode-ам проходим циклом, b,u,i,s,img ...

Последний раз редактировалось Gozar, 19.01.2012 в 17:46.
Ответить с цитированием
  #2 (permalink)  
Старый 19.01.2012, 17:49
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Или может быть как-то отпарсить текст в стек, какой-нибудь универсальной регой, а затем уже с ним работать?
Однако опять не понятно что делать с вложенностью.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #3 (permalink)  
Старый 19.01.2012, 17:53
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Просьба не давать ссылки на гугл, особенно если вы сами не работали с кодом и скриптами предлагаемыми там.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #4 (permalink)  
Старый 19.01.2012, 18:10
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

ну у меня только такой в голову вариант пока что пришел.
var text = 'test [b]bold[/b] blah [code]function(){}[/code] tar [quote]blah blah [i]ta[i]r[/i]am[/i] param[/quote]';

function parseBBCode( text ) {
    return text.replace( /\[(([a-z]+)(?:\=[^\]]+)?)\](.*)\[\/\2\]/gi, function( all, tag, tagAttr, content ) {
        return '<' + tagAttr + '>' + parseBBCode( content ) + '</' + tagAttr + '>';
    });
}

alert( parseBBCode( text ) );
Ответить с цитированием
  #5 (permalink)  
Старый 19.01.2012, 18:25
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

можно сделать и так:
var text = 'test [b=color]bold[/b] blah [code run]function(){}[/code] tar [quote]blah blah [i]ta[i]r[/i]am[/i] param[/quote]';
 
function parseBBCode( text ) {
    return text.replace( /\[(([a-z]+)(?:(?:\=|\s)([^\]]+))?)\](.*)\[\/\2\]/gi, function( all, tagAttr, tag, attr, content ) {

        // tag - содержит имя тега BBCode
        // tagAttr - содержит и тег и его атрибут(ы)
        // attr - трибут(ы) текущего тега
        // content - собственно содержимое этого тега

        return '<' + tagAttr + '>' + parseBBCode( content ) + '</' + tag + '>';
    });
}
 
alert( parseBBCode( text ) );


BBCode теги он ищет такого вида:
[code]
[code=color]
[code run]
[code run hide]

Ну а дальше дело техники и воображения.
Ответить с цитированием
  #6 (permalink)  
Старый 19.01.2012, 19:04
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Понял, берем по максимуму и затем ужимаем, у меня брало по минимуму.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #7 (permalink)  
Старый 19.01.2012, 19:29
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Хотя в том варианте у меня плохо обрабатывал он такой вариант:
test [b=color]bold[/b] tatata [b]blah[/b] tata

можно сделать немного иначе, сначала обработать не жадным методом, а на последок жадным, тем самым мы обработаем все теги корректно.

var text = 'test [b=color]bold[/b] tatata [b]blah[/b] [code run]function(){}[/code] tar [quote]blah blah [i]ta[i]r[/i]am[/i] param[/quote]';
  
function parseBBCode( text, greed ) {
    var re = new RegExp("\\[(([a-z]+)(?:(?:\\=|\\s)([^\\]]+))?)\\](.*" + ( greed ? '' : '?' ) + ")\\[\\/\\2\\]", "gi");
    return text.replace( re, function( all, tagAttr, tag, attr, content ) {
 
        // tag - содержит имя тега BBCode
        // tagAttr - содержит и тег и его атрибут(ы)
        // attr - трибут(ы) текущего тега
        // content - собственно содержимое этого тега

        return '<' + tagAttr + '>' + parseBBCode( content, greed ) + '</' + tag + '>';
    });
}
  
alert( parseBBCode( parseBBCode( text ), true ) );


в реге вместо [a-z]+ можно написать только разрешенные теги, типа:
b|i|u|img|code

Последний раз редактировалось devote, 19.01.2012 в 19:41.
Ответить с цитированием
  #8 (permalink)  
Старый 19.01.2012, 19:46
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Сообщение от devote Посмотреть сообщение
Хотя в том варианте у меня плохо обрабатывал он такой вариант:
В каком? Не понял.

Сообщение от devote Посмотреть сообщение
в реге вместо [a-z]+ можно написать только разрешенные теги, типа:
b|i|u|img|code
Думаю не нужно, я проверяю уже когда в функцию прилетает выбранный кусок, так работать должно быстрее.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #9 (permalink)  
Старый 19.01.2012, 19:47
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от Gozar
В каком?
в первых двух
Сообщение от Gozar
Думаю не нужно, я проверяю уже когда в функцию прилетает выбранный кусок, так работать должно быстрее.
дело выбора как тебе удобнее конечно, с другой стороны твое решение и возможностей больше даст
Ответить с цитированием
  #10 (permalink)  
Старый 19.01.2012, 19:53
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Сообщение от devote Посмотреть сообщение
в первых двух
Вложенность, она самая. Я по этому минимальным брал, а потом засомневался. Теперь вижу что пока зря. Я в минимальном сразу знаю что у меня вложенность нормальная, хотя и парсить будет медленнее.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Парсинг даты Allan Stark Общие вопросы Javascript 4 30.01.2014 18:57
Парсинг времени Falcon Общие вопросы Javascript 2 20.09.2010 17:23
custom Парсинг HTML нужен Increazon Общие вопросы Javascript 8 15.09.2010 13:23
Ищу скрипт для работы с bbcode mTzen Общие вопросы Javascript 3 13.09.2010 07:17
bbcode, iframe и javascript Dark[Ol(U23)leneri] Я не знаю javascript 0 10.06.2009 19:52