Цитата:
|
Цитата:
var BB = new function () {
this.tags = {
U: "ins",
I: "em",
B: "strong",
S: "del"
}
function parseAttr(attr) {
// не реализовано
return "ATTR";
}
var BB = /(?:\[(\/)?\s*(?:((?:\\[\s\S]|[^\[\]\s\=\/])+)(?:\s*=\s*((?:(?:(?:"[^"]*")|(?:'[^']*'))|(?:\\[\s\S]|[^\[\]\s\/]))+))?)\s*\])/g;
this.toHtml = function (string) {
var self = this;
return string.replace(BB, function (m, closed, name, attr) {
name = name.toUpperCase();
return self.tags[name] ?
"<" + (closed || "") + self.tags[name] +
(attr ? " " + parseAttr(attr) : "") + ">" : m;
});
}
}();
var str = "[B]bold [B]bold [B = SOME]bold [I] ITALIC FONT[/I] foo[/B] bar [/B] zot [/B] zorg";
alert(BB.toHtml(str))
Извиняюсь если ерунду ляпнул, голова к вечеру квадратная |
Совсем недавно мне тоже приходилось писать регу для парсинга bbcode, правда всего одного, условного, для подсветки кода. Если принимать во внимание, что писал я ее после ~ недели знакомства с regexp, то, думаю получилось приемлемо (пример, код). Решения, примененные там, считаю далеко не оптимальными)
По вопросу. Признаться, на данный момент, вряд ли я чем смогу Вам помочь и заранее извиняюсь за разведенный флуд, но не могу понять, как может это Цитата:
alert(/\[B\].*?\[\/B\]/.exec("[B]aaaa [B] bbbb[/B] aaa[/B]")); // не жадно
alert(/\[B\].*\[\/B\]/.exec("[B]aaaa [B] bbbb[/B] aaa[/B]")); // жадно
Моя логика подсказывает, что в данном конкретном случае, надо "откусить кусок побольше", а уже потом "чавкать" :) Ссыллки на гугл давать не буду, но кое-что посоветую (если не читали): 4, 5, 6 главы "Дж.Фридл - Регулярные выражения, 3-е изд.[2008]". Если не ошибаюсь, там как раз обсуждаются вопросы эффективности построения регулярных выражений. p.s.: все это моя субъективная точка зрения, Вы, я думаю, опытнее будите в выше обозначенных вопросах, поэтому если что не так, извиняйте) Цитата:
|
Вот самый лучший и качественный вариант, работает без ошибок и начинает действовать с середину, то-есть с вложенных а уж потом обрабатывает родительские теги.
var text = 'test [b=color]bold[/b] tatata [b]blah[/b] tata [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)([^\]]+))?)\](.*)/gi, function( all, tagAttr, tag, attr, end ) {
var re = new RegExp( "(.*?)(\\[\\/(" + tag + ")\\]|\\[([a-z]+.*?)\\])(.*)", "i" );
return parseBBCode( end.replace( re, function( subAll, content, tags, closeTag, openTag, subEnd ) {
if ( openTag ) {
return '[' + tagAttr + ']' + parseBBCode( subAll );
} else {
// tag - содержит имя тега BBCode
// tagAttr - содержит и тег и его атрибут(ы)
// attr - трибут(ы) текущего тега
// content - собственно содержимое этого тега
alert( [ tagAttr, content, closeTag ].join("\n") );
return '<' + tag + '>' + content + '</' + closeTag + '>' + subEnd;
}
}));
});
}
alert( parseBBCode( text ) );
|
Цитата:
Я делаю почти так же как написал devote, идея та же - собственно он мне её и подсказал, но реализация чуть сложнее, проверки разные и т.д. |
Цитата:
|
nerv_,
главное научится код в голове прокручивать, тогда и вопросов меньше станет и код будешь писать хороший, продуманный... |
Gozar, вы об этом и говорили, наверное... Но я повторюсь. Можно делать так, как тут. То есть в цикле убираем самые вложенные (путём замены их на нормальные теги) и цикл гоняем до тех пор, пока можем найти хоть один непреобразованный bb-код.
|
Цитата:
Я делаю именно так как писал выше. Без всяких new RegExp. Сначала выбираем из текста максимум, как бы горку, а потом горку просматриваем от самого вложенного(минимального). Этого должно быть достаточно чтобы не сканить весь текст и не было багов какой-нибудь вложенности, скорость ещё не тестировал, но пока всё нормально и реги мне понятны. Нет никаких end и if, только последовательность, сначала максимум всего, затем уже минимум конкретных тегов рекурсией. |
Цитата:
|
| Часовой пояс GMT +3, время: 17:09. |