PHP/MySQL | Решение проблемы с BB кодами
Здравствуйте. Столкнулся с проблемой в BB кодах. Допустим есть тег [b][/b], выглядит это так:
Работает нормально. Но лишь стоит обрезать текст, например, до 10 символов, и если закрывающий тег не входит в этот список, начинается дичь. Весь текст что идёт ниже становится жирным, т.к. открывающий тег есть, а закрывающего нету. И так со всеми кодами. На многих сайтах встречаю данную проблему, даже на бумасе.
Кто знает, какое есть решение данной проблемы?
$bbcode['/\[b\](.+)\[\/b\]/isU'] = '<b>$1</b>';
Работает нормально. Но лишь стоит обрезать текст, например, до 10 символов, и если закрывающий тег не входит в этот список, начинается дичь. Весь текст что идёт ниже становится жирным, т.к. открывающий тег есть, а закрывающего нету. И так со всеми кодами. На многих сайтах встречаю данную проблему, даже на бумасе.
Кто знает, какое есть решение данной проблемы?
PixPlay (06.10.2020 в 20:22)
Здравствуйте. Столкнулся с проблемой в BB кодах. Допустим есть тег [/b], выглядит это так:
Работает нормально. Но лишь стоит обрезать текст, например, до 10 символов, и если закрывающий тег не входит в этот список, начинается дичь. Весь текст что идёт ниже становится жирным, т.к. открывающий тег есть, а закрывающего нету. И так со всеми кодами. На многих сайтах встречаю данную проблему, даже на бумасе.
Кто знает, какое есть решение данной проблемы?
Здравствуйте. Столкнулся с проблемой в BB кодах. Допустим есть тег [/b], выглядит это так:
$bbcode['/[b](.+)
/isU'] = '<b>$1</b>';Работает нормально. Но лишь стоит обрезать текст, например, до 10 символов, и если закрывающий тег не входит в этот список, начинается дичь. Весь текст что идёт ниже становится жирным, т.к. открывающий тег есть, а закрывающего нету. И так со всеми кодами. На многих сайтах встречаю данную проблему, даже на бумасе.
Кто знает, какое есть решение данной проблемы?
<?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( ' ', ' ' );
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="([- 0-9a-zа-яА-Я]{1,30})"\](.+)\[\/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], выглядит это так:
Работает нормально. Но лишь стоит обрезать текст, например, до 10 символов, и если закрывающий тег не входит в этот список, начинается дичь. Весь текст что идёт ниже становится жирным, т.к. открывающий тег есть, а закрывающего нету. И так со всеми кодами. На многих сайтах встречаю данную проблему, даже на бумасе.
Кто знает, какое есть решение данной проблемы?
Здравствуйте. Столкнулся с проблемой в BB кодах. Допустим есть тег [/b], выглядит это так:
$bbcode['/[b](.+)
/isU'] = '<b>$1</b>';Работает нормально. Но лишь стоит обрезать текст, например, до 10 символов, и если закрывающий тег не входит в этот список, начинается дичь. Весь текст что идёт ниже становится жирным, т.к. открывающий тег есть, а закрывающего нету. И так со всеми кодами. На многих сайтах встречаю данную проблему, даже на бумасе.
Кто знает, какое есть решение данной проблемы?
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)
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>';
пробуй так
$bbcode['/(.+)/isU']='<strong>$1</strong>';
пробуй так
А какая разница? Со всеми тегами так
PixPlay (06.10.2020 в 22:06)
А какая разница? Со всеми тегами так
А какая разница? Со всеми тегами так
Покажи код свой?
PixPlay, здесь только одно разумное решение, дополнительная обработка конечного html библиотекой tidy
https://www.php.net/manual/ru/book.tidy.php
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
PixPlay, здесь только одно разумное решение, дополнительная обработка конечного html библиотекой tidy
https://www.php.net/manual/ru/book.tidy.php
Благодарю, попробую
Toruz,
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('#<\?(.*?)\?>#sui', 'bbcodehightlight', $msg);
$msg=preg_replace('#\[code\](.*?)\[/code\]#si', '\1', $msg);
}
return $msg;
}
Стр.: 1, 2