PHP/MySQL | Решение проблемы с BB кодами
Здравствуйте. Столкнулся с проблемой в BB кодах. Допустим есть тег [b][/b], выглядит это так: Работает нормально. Но лишь стоит обрезать текст, например, до 10 символов, и если закрывающий тег не входит в этот список, начинается дичь. Весь текст что идёт ниже становится жирным, т.к. открывающий тег есть, а закрывающего нету. И так со всеми кодами. На многих сайтах встречаю данную проблему, даже на бумасе. Кто знает, какое есть решение данной проблемы?
php
$bbcode['/\[b\](.+)\[\/b\]/isU'] = '<b>$1</b>'; PixPlay (06.10.2020 в 20:22) Здравствуйте. Столкнулся с проблемой в BB кодах. Допустим есть тег [/b], выглядит это так: Работает нормально. Но лишь стоит обрезать текст, например, до 10 символов, и если закрывающий тег не входит в этот список, начинается дичь. Весь текст что идёт ниже становится жирным, т.к. открывающий тег есть, а закрывающего нету. И так со всеми кодами. На многих сайтах встречаю данную проблему, даже на бумасе. Кто знает, какое есть решение данной проблемы?
php
$bbcode['/[b](.+) /isU'] = '<b>$1</b>'; 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( ' ', ' ' ); 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 символов, и если закрывающий тег не входит в этот список, начинается дичь. Весь текст что идёт ниже становится жирным, т.к. открывающий тег есть, а закрывающего нету. И так со всеми кодами. На многих сайтах встречаю данную проблему, даже на бумасе. Кто знает, какое есть решение данной проблемы?
php
$bbcode['/[b](.+) /isU'] = '<b>$1</b>'; 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) в массиве
Неа, проблема остаётся. И ещё хуже, раньше, если в полном тексте поставить [code] он не срабатывал, то теперь срабатывает, даже без закрывающего тега
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;} ________
посл. ред. 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 ,
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('#<\?(.*?)\?>#sui', 'bbcodehightlight', $msg); $msg=preg_replace('#\[code\](.*?)\[/code\]#si', '\1', $msg); } return $msg; } Стр.: 1, 2