Цитата:
|
Цитата:
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, время: 04:24. |