Loading...
PHP/MySQL | Решение проблемы с BB кодами
Здравствуйте. Столкнулся с проблемой в BB кодах. Допустим есть тег [b][/b], выглядит это так:
php
   $bbcode['/\[b\](.+)\[\/b\]/isU'] = '<b>$1</b>';   
Работает нормально. Но лишь стоит обрезать текст, например, до 10 символов, и если закрывающий тег не входит в этот список, начинается дичь. Весь текст что идёт ниже становится жирным, т.к. открывающий тег есть, а закрывающего нету. И так со всеми кодами. На многих сайтах встречаю данную проблему, даже на бумасе. Кто знает, какое есть решение данной проблемы?
PixPlay (06.10.2020 в 20:22) Здравствуйте. Столкнулся с проблемой в BB кодах. Допустим есть тег [/b], выглядит это так:
php
   $bbcode['/[b](.+)  /isU'] = '<b>$1</b>';   
Работает нормально. Но лишь стоит обрезать текст, например, до 10 символов, и если закрывающий тег не входит в этот список, начинается дичь. Весь текст что идёт ниже становится жирным, т.к. открывающий тег есть, а закрывающего нету. И так со всеми кодами. На многих сайтах встречаю данную проблему, даже на бумасе. Кто знает, какое есть решение данной проблемы?
php
   <?php // Функция обработки bbCode  function print_page($message) {   // Разрезаем слишком длинные слова     $message = preg_replace_callback(               "|([a-zа-я\d!]{35,})|i",               "split_text",               $message);        // Тэги - [code], [php]   preg_match_all( "#\[php\](.+)\[\/php\]#isU", $message, $matches );   $cnt = count( $matches[0] );    for ( $i = 0; $i < $cnt; $i++ ) {     $phpBlocks[] = '<div class="codePHP">'.highlight_string( $matches[1][$i], true ).'</div>';     $uniqidPHP = '[php_'.uniqid('').']';     $uniqidsPHP[] = $uniqidPHP;     $message = str_replace( $matches[0][$i], $uniqidPHP, $message );    }    $spaces = array( ' ', "\t" );   $entities = array( '&nbsp;', '&nbsp;&nbsp;&nbsp;&nbsp;' );    preg_match_all( "#\[code\](.+)\[\/code\]#isU", $message, $matches );   $cnt = count( $matches[0] );    for ( $i = 0; $i < $cnt; $i++ ) {     $codeBlocks[] = '<div class="code">'.nl2br( str_replace( $spaces, $entities, htmlspecialchars( $matches[1][$i] ) ) ).'</div>';     $uniqidCode = '[code_'.uniqid('').']';     $uniqidsCode[] = $uniqidCode;     $message = str_replace( $matches[0][$i], $uniqidCode, $message );    }  // обработка регулярными выражениями bb кодов   $message = htmlspecialchars( $message );   $message = preg_replace("#\[b\](.+)\[\/b\]#isU", '<b>\\1</b>', $message);   $message = preg_replace("#\[i\](.+)\[\/i\]#isU", '<i>\\1</i>', $message);   $message = preg_replace("#\[u\](.+)\[\/u\]#isU", '<u>\\1</u>', $message);   $message = preg_replace("#\[quote\](.+)\[\/quote\]#isU",'<div class="quoteHead">Цитата</div><div class="quoteContent">\\1</div>',$message);   $message = preg_replace("#\[quote=&quot;([- 0-9a-zа-яА-Я]{1,30})&quot;\](.+)\[\/quote\]#isU", '<div class="quoteHead">\\1 пишет:</div><div class="quoteContent">\\2</div>', $message);   $message = preg_replace("#\[url\][\s]*([\S]+)[\s]*\[\/url\]#isU",'<a href="\\1" target="_blank">\\1</a>',$message);   $message = preg_replace("#\[url[\s]*=[\s]*([\S]+)[\s]*\][\s]*([^\[]*)\[/url\]#isU",                              '<a href="\\1" target="_blank">\\2</a>',$message);   $message = preg_replace("#\[img\][\s]*([\S]+)[\s]*\[\/img\]#isU",'<img src="\\1" alt="" />',$message);   $message = preg_replace("#\[color=red\](.+)\[\/color\]#isU",'<span style="color:#FF0000">\\1</span>',$message);   $message = preg_replace("#\[color=green\](.+)\[\/color\]#isU",'<span style="color:#008000">\\1</span>',$message);   $message = preg_replace("#\[color=blue\](.+)\[\/color\]#isU",'<span style="color:#0000FF">\\1</span>',$message);   $message = preg_replace_callback("#\[list\]\s*((?:\[\*\].+)+)\[\/list\]#siU",'getUnorderedList',$message);   $message = preg_replace_callback("#\[list=([a|1])\]\s*((?:\[\*\].+)+)\[\/list\]#siU", 'getOrderedList',$message);  // добавляем переносы строк   $message = nl2br( $message);    if ( isset( $uniqidCode ) ) $message = str_replace( $uniqidsCode, $codeBlocks, $message );   if ( isset( $uniqidPHP ) ) $message = str_replace( $uniqidsPHP, $phpBlocks, $message );  // Возвращаем уже код с html вместо bb code   return $message; }  ?>   
PixPlay (06.10.2020 в 20:22) Здравствуйте. Столкнулся с проблемой в BB кодах. Допустим есть тег [/b], выглядит это так:
php
   $bbcode['/[b](.+)  /isU'] = '<b>$1</b>';   
Работает нормально. Но лишь стоит обрезать текст, например, до 10 символов, и если закрывающий тег не входит в этот список, начинается дичь. Весь текст что идёт ниже становится жирным, т.к. открывающий тег есть, а закрывающего нету. И так со всеми кодами. На многих сайтах встречаю данную проблему, даже на бумасе. Кто знает, какое есть решение данной проблемы?
php
   function parse_bb_code($text)    {     $text = preg_replace('/\[(\/?)(b|i|u|s)\s*\]/', "<$1$2>", $text);          $text = preg_replace('/\[code\]/', '<pre><code>', $text);     $text = preg_replace('/\[\/code\]/', '</code></pre>', $text);          $text = preg_replace('/\[(\/?)quote\]/', "<$1blockquote>", $text);     $text = preg_replace('/\[(\/?)quote(\s*=\s*([\'"]?)([^\'"]+)\3\s*)?\]/', "<$1blockquote>Цитата $4:", $text);          $text = preg_replace('/\[url\](?:http:\/\/)?([a-z0-9-.]+\.\w{2,4})\[\/url\]/', "<a href=\"http://$1\">$1</a>", $text);     $text = preg_replace('/\[url\s?=\s?([\'"]?)(?:http:\/\/)?([a-z0-9-.]+\.\w{2,4})\1\](.*?)\[\/url\]/', "<a href=\"http://$2\">$3</a>", $text);               $text = preg_replace('/\[img\s*\]([^\]\[]+)\[\/img\]/', "<img src='$1'/>", $text);     $text = preg_replace('/\[img\s*=\s*([\'"]?)([^\'"\]]+)\1\]/', "<img src='$2'/>", $text);          return $text; }   
в массиве
Toruz (06.10.2020 в 20:32)
php
   function parse_bb_code($text)    {    $text = preg_replace('/[(/?)(b|i|u|s)s*]/', "<$1$2>", $text);        $text = preg_replace('/  /', '<pre><code>', $text);    $text = preg_replace('/  /', '</code></pre>', $text);        $text = preg_replace('/[(/?)quote]/', "<$1blockquote>", $text);    $text = preg_replace('/[(/?)quote(s*=s*(['"]?)([^'"]+)3s*)?]/', "<$1blockquote>Цитата $4:", $text);        $text = preg_replace('/[url](?:http://)?([a-z0-9-.]+.w{2,4})[/url]/', "<a href="http://$1">$1</a>", $text);    $text = preg_replace('/[urls?=s?(['"]?)(?:http://)?([a-z0-9-.]+.w{2,4})1](.*?)[/url]/', "<a href="http://$2">$3</a>", $text);            $text = preg_replace('/[imgs*]([^][]+)[/img]/', "<img src='$1'/>", $text);    $text = preg_replace('/[imgs*=s*(['"]?)([^'"]]+)1]/', "<img src='$2'/>", $text);        return $text;}   
в массиве
Неа, проблема остаётся. И ещё хуже, раньше, если в полном тексте поставить [code] он не срабатывал, то теперь срабатывает, даже без закрывающего тега
________
посл. ред. 06.10.2020 в 21:06; всего 1 раз(а); by PixPlay
$bbcode['/\[b\](.+)\[\/b\]/isU']='<strong>$1</strong>';
пробуй так
Mishae72 (06.10.2020 в 21:21)
$bbcode['/ (.+) /isU']='<strong>$1</strong>';
пробуй так

А какая разница? Со всеми тегами так
PixPlay (06.10.2020 в 22:06)
А какая разница? Со всеми тегами так


Покажи код свой?
PixPlay , здесь только одно разумное решение, дополнительная обработка конечного html библиотекой tidy

https://www.php.net/manual/ru/book.tidy.php
Сибирский (07.10.2020 в 08:48)
PixPlay , здесь только одно разумное решение, дополнительная обработка конечного html библиотекой tidy

https://www.php.net/manual/ru/book.tidy.php

Благодарю, попробую
Toruz ,
php
   function BBcode($msg) { global $set,$user;  $bbcode=array();     $bbcode['/\[url=(.+)\](.+)\[\/url\]/isU'] = '<a href="$1">$2</a>';    $bbcode['/\r\n/isU']='<br/>';   $bbcode['/\[br\]/isU']='<br />';  if ($set['bb_i'])$bbcode['/\[i\](.+)\[\/i\]/isU'] = '<em>$1</em>'; if ($set['bb_b'])$bbcode['/\[b\](.+)\[\/b\]/isU'] = '<strong>$1</strong>'; if ($set['bb_u'])$bbcode['/\[u\](.+)\[\/u\]/isU'] = '<span style="text-decoration:underline;">$1</span>'; if ($set['bb_big'])$bbcode['/\[big\](.+)\[\/big\]/isU'] = '<span style="font-size:large;">$1</span>'; if ($set['bb_small'])$bbcode['/\[small\](.+)\[\/small\]/isU'] = '<span style="font-size:small;">$1</span>'; if ($set['bb_red'])$bbcode['/\[red\](.+)\[\/red\]/isU'] = '<span style="color:#ff0000;">$1</span>'; if ($set['bb_yellow'])$bbcode['/\[yellow\](.+)\[\/yellow\]/isU'] = '<span style="color:#ffff22;">$1</span>'; if ($set['bb_green'])$bbcode['/\[green\](.+)\[\/green\]/isU'] = '<span style="color:#00bb00;">$1</span>'; if ($set['bb_blue'])$bbcode['/\[blue\](.+)\[\/blue\]/isU'] = '<span style="color:#0000bb;">$1</span>'; if ($set['bb_white'])$bbcode['/\[white\](.+)\[\/white\]/isU'] = '<span style="color:#ffffff;">$1</span>';    $bbcode['/\[cit\](.+)\[\/cit\]/isU'] = '<div class="citations">$1</div>';   $bbcode['/\[marquee\](.+)\[\/marquee\]/isU'] = '<marquee>$1</marquee>';   $bbcode['/\[right\](.+)\[\/right\]/isU'] = '<div style="text-align: right;">$1</div>';   $bbcode['/\[left\](.+)\[\/left\]/isU'] = '<div style="text-align: left;">$1</div>';   $bbcode['/\[center\](.+)\[\/center\]/isU'] = '<center>$1</center>'; $bbcode['/\[background=(.+)\](.+)\[\/background\]/isU'] = '<div style="background-color:$1; display: block;">$2</div>'; $bbcode['/\[color=(.+)\](.+)\[\/color\]/isU'] = '<span style="color:$1;">$2</span>';     if (count($bbcode))$msg = preg_replace(array_keys($bbcode), array_values($bbcode), $msg);  if ($set['bb_code']) { $msg = preg_replace_callback('#&lt;\?(.*?)\?&gt;#sui', 'bbcodehightlight', $msg); $msg=preg_replace('#\[code\](.*?)\[/code\]#si', '\1', $msg); }   return $msg;  }   
Онлайн: 2
Время:
Gen. 0.165
(c) Bym.Guru 2010-2026