Не знал, куда написать, решил сюда. Какая функция превращает 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,от первого до последнего символа,повторяло бб -цитирование,сейчас -фиг,нет и доли того,что требуется.
Или что такое бб -цитирование?