19.01.2012, 17:41
|
|
猫
|
|
Регистрация: 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.
|
|
19.01.2012, 17:49
|
|
猫
|
|
Регистрация: 07.06.2007
Сообщений: 7,504
|
|
Или может быть как-то отпарсить текст в стек, какой-нибудь универсальной регой, а затем уже с ним работать?
Однако опять не понятно что делать с вложенностью.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
|
|
19.01.2012, 17:53
|
|
猫
|
|
Регистрация: 07.06.2007
Сообщений: 7,504
|
|
Просьба не давать ссылки на гугл, особенно если вы сами не работали с кодом и скриптами предлагаемыми там.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
|
|
19.01.2012, 18:10
|
что-то знаю
|
|
Регистрация: 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 ) );
|
|
19.01.2012, 18:25
|
что-то знаю
|
|
Регистрация: 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]
Ну а дальше дело техники и воображения.
|
|
19.01.2012, 19:04
|
|
猫
|
|
Регистрация: 07.06.2007
Сообщений: 7,504
|
|
Понял, берем по максимуму и затем ужимаем, у меня брало по минимуму.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
|
|
19.01.2012, 19:29
|
что-то знаю
|
|
Регистрация: 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.
|
|
19.01.2012, 19:46
|
|
猫
|
|
Регистрация: 07.06.2007
Сообщений: 7,504
|
|
Сообщение от devote
|
Хотя в том варианте у меня плохо обрабатывал он такой вариант:
|
В каком? Не понял.
Сообщение от devote
|
в реге вместо [a-z]+ можно написать только разрешенные теги, типа:
b|i|u|img|code
|
Думаю не нужно, я проверяю уже когда в функцию прилетает выбранный кусок, так работать должно быстрее.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
|
|
19.01.2012, 19:47
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
Сообщение от Gozar
|
В каком?
|
в первых двух
Сообщение от Gozar
|
Думаю не нужно, я проверяю уже когда в функцию прилетает выбранный кусок, так работать должно быстрее.
|
дело выбора как тебе удобнее конечно, с другой стороны твое решение и возможностей больше даст
|
|
19.01.2012, 19:53
|
|
猫
|
|
Регистрация: 07.06.2007
Сообщений: 7,504
|
|
Сообщение от devote
|
в первых двух
|
Вложенность, она самая. Я по этому минимальным брал, а потом засомневался. Теперь вижу что пока зря. Я в минимальном сразу знаю что у меня вложенность нормальная, хотя и парсить будет медленнее.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
|
|
|
|