Не знал, куда написать, решил сюда. Какая функция превращает bbcode в html? Просто мне надо сделать две функции: одна конвертирует bbcode в html, а другая обратно. В кодах покопался, но ничего не нашёл. Помогите, пожалуйста!
Парсинг bbcode
Сообщений 1 страница 10 из 10
Поделиться2Ср, 6 Май 2020 13:10:11
Hyppoprogramm
Парсер постов - в движке форума в php. Движок закрытый, да и php код в любом случае Вам вряд ли что-то даст.
Для примера парсера на javascript можете посмотреть скрипты Мгновенный предпросмотр сообщений (bbcode -> html) и Цитирование с BB-кодами (html -> bbcode).
Поделиться3Ср, 6 Май 2020 17:50:17
Спасибо!
Поделиться4Ср, 6 Май 2020 18:03:29
Alex_63, честно говоря, ваш код просто не читаем. Это специально так задомано? От вашего кода голова кругом идёт. Не могу найти ту часть, где переводят html в bbcode.
Попробую привести код в порядок. Может будет понятней. 
Поделиться5Ср, 6 Май 2020 18:08:38
Нет, к сожалению я вообще не понимаю что это... 
Поделиться6Ср, 6 Май 2020 18:14:45
Вот первый код очень понятен:
function ParseContent () {
if($('#main-reply:first').parents('.post').length)return;
//==== Распарс bbcode в контенте textarea ====//
var cnt = $('#main-reply:first').val(); //alert(cnt);
// Отключаем распознавание HTML кодов
cnt = cnt.replace(/&/g,'&'); cnt = cnt.replace(/</g,'<'); cnt = cnt.replace(/>/g,'>');
// Распарс блока Код Ч1 - //Вынимаем блоки код;
var arrCODE = [],j=0;
function repl1 (str, p1, offset, s){arrCODE[j]=p1; return ';code-' + j++ +';'}
cnt = cnt.replace(/\[code\]((?:[\s\S](?!\[\/{0,1}code\]))*[\s\S]{0,1})\[\/code\]/gm,repl1);
function replTableTd(str,attr,txt,offset,s1){
var attrArr = attr.split(/\s/gim),strS1 = '',strS2 = '';
for(var i=0;i<attrArr.length;i++){
var s = attrArr[i].split(/=/gim);
if(s==''||!s[1])continue;
s[1] = s[1].replace(/^"/gim,'').replace(/"$/gim,'');
if(s[0]=='width'){strS2 += s[0]+':'+s[1]+';';}
if(s[0]=='colspan'||s[0]=='rowspan'){strS1 += ' '+s[0]+'="'+s[1]+'"';}
if(s[0]=='bgcolor'){ strS2+='background-color:'+s[1]+';';};
}; //console.log(attrArr);
if(strS2!=''){strS2 = ' style="'+strS2+'"';};
return ( '<td'+strS1+strS2+'>'+txt+'</td>' );// return L;
}
// Распарс таблиц ч1
cnt = cnt.replace(/(\[\/?(td|tr)\])(\n+)/mgi,'$1'); cnt = cnt.replace(/\[\/table\](\n+)/mgi, '[/table]');
cnt = cnt.replace(/\[table([\s\S]*?)\](\n+)/mgi, '[table$1]'); cnt = cnt.replace(/\[td([\s\S]*?)\]([\s\S]*?)\[\/td\]/mgi,replTableTd);
cnt = cnt.replace(/\[td\]([\s\S]*?)\[\/td\]/mgi,'<td>$1</td>'); cnt = cnt.replace(/\[tr\]([\s\S]*?)\[\/tr\]/mgi,'<tr>$1</tr>');
// Парсим переносы строк
cnt = ('<p>'+cnt+'</p>').replace(/\n\n/g,'<\/p><p>').replace(/\n/g,'<br>');
var RXquoteP = /\[quote="#p(.*?),(.*?)"\](.*?)\[\/quote\]/gi, RXquoteL = /\[quote="(.*?),http:\/\/(.*?)"\](.*?)\[\/quote\]/gi;
var RXquoteQ = /\[quote="(.*?)"\](.*?)\[\/quote\]/gi, RXquote = /\[quote=(.*?)\](.*?)\[\/quote\]/gi, RXquote0 = /\[quote\](.*?)\[\/quote\]/gi;
var BBquoteP = '</p><div class="quote-box"><cite><a href=/viewtopic.php?pid=$1#p=$1>$2 '+PPREV.quote_cite+'</a></cite><blockquote><p>$3</p></blockquote></div><p>';
var BBquoteL = '</p><div class="quote-box"><cite><a href=\"http://$2\">$1 '+PPREV.quote_cite+'</a></cite><blockquote><p>$3</p></blockquote></div><p>';
var BBquote0 = '</p><div class="quote-box"><blockquote><p>$1</p></blockquote></div><p>';
var BBquote = '</p><div class="quote-box"><cite>$1 '+PPREV.quote_cite+'</cite><blockquote><p>$2</p></blockquote></div><p>';
var BBhidText = '</p><div class="quote-box"><cite>Скрытый текст:</cite><blockquote><p>$2</p></blockquote></div><p>'; var spLlIn='$(this).toggleClass(\'visible\'); $(this).next().toggleClass(\'visible\');';
var BBspoiler0 = '</p><div class="quote-box spoiler-box"><div onclick="'+ spLlIn +'">Свернутый текст</div><blockquote><p>$1</p></blockquote></div><p>';
var BBspoiler = '</p><div class="quote-box spoiler-box"><div onclick="'+ spLlIn +'">$1</div><blockquote><p>$2</p></blockquote></div><p>';
// Парсим BB коды
cnt = cnt.replace(/\[b\](.*?)\[\/b\]/gi,'<strong>$1</strong>'); cnt = cnt.replace(/\[i\](.*?)\[\/i\]/gi,'<span style="font-style:italic">$1</span>');
cnt = cnt.replace(/\[u\](.*?)\[\/u\]/gi,'<em class="bbuline">$1</em>'); cnt = cnt.replace(/\[s\](.*?)\[\/s\]/gi,'<del>$1</del>');
cnt = cnt.replace(/\[h\](.*?)\[\/h\]/gi,'<span class="highlight-text">$1</span>'); cnt = cnt.replace(/\[hr\]/g,'<hr>');
cnt = cnt.replace(/\[sup\](.*?)\[\/sup\]/gi,'<sup>$1</sup>');cnt = cnt.replace(/\[sub\](.*?)\[\/sub\]/gi,'<sub>$1</sub>');
cnt = cnt.replace(/\[you\]/g,UserLogin);
var j=0;if(typeof(QuoteImg)=='undefined'){while(j<4){cnt = cnt.replace(RXquoteP,BBquoteP);j++};j=0;while(j<4){cnt = cnt.replace(RXquoteL,BBquoteL);j++}}
j=0;while(j<4){cnt = cnt.replace(RXquoteQ,BBquote);j++};j=0;while(j<4){cnt = cnt.replace(RXquote,BBquote);j++};j=0;while(j<4){cnt = cnt.replace(RXquote0,BBquote0);j++}
cnt = cnt.replace(/\[hide=(.*?)\](.*?)\[\/hide\]/gi,BBhidText);
cnt = cnt.replace(/\[spoiler="(.*?)"\](.*?)\[\/spoiler\]/gi,BBspoiler); cnt = cnt.replace(/\[spoiler="(.*?)"\](.*?)\[\/spoiler\]/gi,BBspoiler);
cnt = cnt.replace(/\[spoiler=(.*?)\](.*?)\[\/spoiler\]/gi,BBspoiler); cnt = cnt.replace(/\[spoiler\](.*?)\[\/spoiler\]/gi,BBspoiler0);
cnt = cnt.replace(/\[font=(.*?)\](.*?)\[\/font\]/gi,'<span style="font-family: $1;">$2</span>');
cnt = cnt.replace(/\[size=(.*?)\](.*?)\[\/size\]/gi,'<span style="font-size: $1px;">$2</span>');
cnt = cnt.replace(/\[color=(.*?)\](.*?)\[\/color\]/gi,'<span style="color: $1">$2</span>');
cnt = cnt.replace(/\[align=(.*?)\](.*?)\[\/align\]/gi,'<span style="display: block; text-align: $1">$2</span>');
cnt = cnt.replace(/\[img\](.*?)\[\/img\]/gi,'<img src="$1" class="postimg" />');
cnt = cnt.replace(/\[img=(.*?)\](.*?)\[\/img\]/gi,'<img src="$2" class="postimg" title="$1" alt="$1" />');
cnt = cnt.replace(/\[url=(.*?)\](.*?)\[\/url\]/gi,'<a href="$1">$2</a>');
cnt = cnt.replace(/\[url\](.*?)\[\/url\]/gi,'<a href="$1">$1</a>');
cnt = cnt.replace(/\[video\](.*?)\[\/video\]/gi,'<iframe width="480" height="284" src="$1" frameborder="0" allowfullscreen=""></iframe>');
// Распарс остальных BBКодов
cnt = cnt.replace(/\[abbr="(.*?)"\](.*?)\[\/abbr\]/gi,'<abbr title="$1">$2</abbr>');
cnt = cnt.replace(/\[add\]/g,'<strong>Добавлено спустя</strong>');
cnt = cnt.replace(/\[mark\](.*?)\[\/mark\]/gi,'<span class="highlight-text">$1</span>');
// Распарс таблиц ч2
function replTable(str,attr,txt,s){attr=attr.replace(/layout/g,'table-layout').replace(/=/g,':').replace(/^\s/,'').replace(/\s/gm,';');return '<table style="'+attr+'">'+txt+'</table>'}
cnt = cnt.replace(/\[table(.*?)\](.*?)\[\/table\]/mgi,replTable);
// Распарс Смайлов
var SmileObj = FORUM.get('editor.smile.smilies');
var SmileDir = FORUM.get('editor.smile.dir');
for (var s in SmileObj) {
var reg = new RegExp('\\s'+s.replace(/([\'\-\^\|\(\)])/g,'\\$1')+'\\s','gm');
cnt = cnt.replace(reg,' <img src="'+SmileDir+'/'+SmileObj[s]+'" alt="'+s+'"> ');
};
// Парсим пробелы
cnt = cnt.replace(/ /g,' ');
// Распарс блока Код Ч2, - Возвращаем блоки код
var st = '</p><div class="code-box"><strong class="legend">Код:</strong><div class="blockcode"><div class="scrollbox" style="min-height:4.5em"><pre>';
var end = '</pre></div></div></div><p>';
function repl2 (str, p1, offset, s) {return st + arrCODE[+p1] + end;}
if(arrCODE.length)cnt = cnt.replace(/;code-(\d+);/gm,repl2);
// Поправка переносов строк
cnt = cnt.replace(/<blockquote><br>/g,'<blockquote>'); cnt = cnt.replace(/<pre><br>/g,'<pre>');
cnt = cnt.replace(/<\/div><p><br>/g,'<\/div><p>');cnt = cnt.replace(/<p><\/p><div/g,'<div');
cnt = cnt.replace(/<\/div><p><\/p><p>/g,'<\/div><p>'); cnt = cnt.replace(/<p><br>/g,'<p>');
cnt = cnt.replace(/<hr><br><br>/g,'<hr>'); cnt = cnt.replace(/<hr><br>/g,'<hr>');
//==== Скрываем/показываем предпросмотр при вводе====//
if(cnt === '' && $('#post-preview').css('display') != 'none'){ $('#post-preview').css({'display':'none'}); }
if(cnt != '' && $('#post-preview').css('display') == 'none'){ $('#post-preview').css({'display':'block'});}
if(cnt === '' && $('#post-preview').css('display') == 'none') { $('#post-preview').css({'display':'none'}); }
if(cnt === '<p></p>' && $('#post-preview').css('display') == 'none') { $('#post-preview').css({'display':'none'}); }
if(cnt === '<p></p>' && $('#post-preview').css('display') != 'none') { $('#post-preview').css({'display':'none'}); }
$('#post-preview').find('.post-content').html(cnt);
$('#post-preview').find('.post-box').each(function(){
$(this).html($(this).html().replace('<\/div><p><\/p></div>','</div></div>'));
$(this).html($(this).html().replace('<\/div><p><\/p><p><\/p></div>','</div></div>'));
});
if(typeof(QuoteImg)!='undefined' &&!$('#pun-messages').length){
$('.punbb').prepend('<style id="Hide_qCite">#post-preview .quote-box>cite{visibility:hidden!important;}</style>');
setLinkAndAva('#post-preview');
}
window.HTMLinPost && HTMLinPost.parseTags('#post-preview');
Поделиться7Ср, 6 Май 2020 18:36:26
Алекс, не могли бы вы скинуть код конвертации HTML в BBcode?
Отредактировано Hyppoprogramm (Ср, 6 Май 2020 19:18:54)
Поделиться8Ср, 6 Май 2020 19:17:08
Hyppoprogramm
Он в Вашем предыдущем сообщении и есть.
Если имелось в виду наоборот - из HTML в BBCode, то код BB-цитирования можно предварительно развернуть в удобочитаемый вид, например, используя beautifier.io.
Поделиться9Ср, 6 Май 2020 20:05:53
Всё равно плохо понимаю... Тут функции названы как-то странно... Или может я туповат... 
Поделиться10Ср, 6 Май 2020 21:52:01
Hyppoprogramm
Парсер постов - в движке форума в php. Движок закрытый, да и php код в любом случае Вам вряд ли что-то даст.
Для примера парсера на javascript можете посмотреть скрипты Мгновенный предпросмотр сообщений (bbcode -> html) и Цитирование с BB-кодами (html -> bbcode).
Добрый вечер.
И не работает B.B. Цитирование,все что меж тегами html ,бб -цитирование в упор не видит.
Как хорошо,что нашла эту тему,раньше работало все было хорошо,а теперь нет.
Вот с примерами.
Так выглядит оформление фильмов на нашем форуме.
Жмём B.B.-цитирование ,получаем.

Где открытие хоть одного HTML?Нет его.
Какое ж это бб цитирование?
Или я чего—то не понимаю?
Раньше,все что было в html,от первого до последнего символа,повторяло бб -цитирование,сейчас -фиг,нет и доли того,что требуется.
Или что такое бб -цитирование?