Разобрать BB-код для PHPBB3

Ищем анализ кода BB в PHP с использованием функций PHPBB3. Я зашел так далеко:

<?php
    include_once("../../forum/includes/functions_content.php");

    $text = "[b]bold text here[/b] not bold here";
    $uid = $bitfield = $options = '';

    echo("parsing");
    echo generate_text_for_storage($text, $uid, $bitfield, $options, true, true, true);
    echo("finished");
?>

Однако он повторяет parsing, но после этого не продолжается. Я ожидаю, что вывод будет выглядеть следующим образом:

<b>bold text here</b> not bold here

Любая помощь очень ценится!

Изменить

Никакие ответы по-прежнему не работают. Я ищу Standalone php-страницу, которая превращает заданную строку кода BB в строку HTML с помощью синтаксического анализатора PHPBB3 BBCode.


person Tom Gullen    schedule 21.02.2014    source источник
comment
попробуйте назначить generate_text_for_storage переменной, чтобы вы могли ее var_dump. Это может показать вам, что происходит   -  person DescX    schedule 21.02.2014
comment
@Brainscrewer var_dump ничего не показывает (я предполагаю, что он не работает при вызове функции)   -  person Tom Gullen    schedule 21.02.2014
comment
Временно добавьте несколько строк var dump/echo в функцию, чтобы увидеть, где и почему она терпит неудачу?   -  person naththedeveloper    schedule 21.02.2014
comment
Вам нужно вызвать generate_text_for_display() после вызова *_storage   -  person stckrboy    schedule 21.02.2014
comment
@stckrboy пытался это сделать, но пока безуспешно. У кого-нибудь есть рабочий пример файла php?   -  person Tom Gullen    schedule 21.02.2014
comment
Вы уверены, что ваш файл правильно включен (вместо этого используйте resquire_once)? У вас в консоли ошибка 500? Вы видите логи php?   -  person Brewal    schedule 24.02.2014
comment
@TomGullen, если вы хотите использовать сторонние библиотеки, может пригодиться мой собственный шорткод: github.com/thunderer /Шорткод .   -  person Tomasz Kowalczyk    schedule 23.01.2017


Ответы (4)


Генерация bbcodes — это двухэтапный процесс. Вы делаете первый шаг (первый проход)

generate_text_for_storage предназначен для хранения bbcode в базе данных. Он хранится как bbcode, потому что вы можете изменить bbcode без необходимости повторного анализа старых сообщений.

Другая функция, которую вы ищете, это

generate_text_for_display

У PHPBB есть вики со списком подобных вещей

https://wiki.phpbb.com/Tutorial.Parsing_text

https://wiki.phpbb.com/Generate_text_for_display

страницы, которые вы ищете.

В качестве альтернативы вы можете использовать класс bbcode напрямую, код, который также работает

$bbcode = new bbcode(base64_encode($bbcode_bitfield));
$bbcode->bbcode_second_pass($post_text, $posts_row['bbcode_uid'], $posts_row['bbcode_bitfield']);
$post_text = smiley_text($post_text);
$post_text = censor_text($post_text);

Тебе понадобится

include($phpbb_root_path . 'includes/bbcode.' . $phpEx);
include($phpbb_root_path . 'includes/functions_display.' . $phpEx);

чтобы работал последний

Полный код метода 2 функций с выводом

<?php
ini_set('display_errors', 1);
define('IN_PHPBB', true);
$phpbb_root_path = './forum/';
$phpEx = "php";
include($phpbb_root_path . 'common.' . $phpEx);
include($phpbb_root_path . 'includes/bbcode.' . $phpEx);
include($phpbb_root_path . 'includes/functions_display.' . $phpEx);

// Start session management
$user->session_begin();
$auth->acl($user->data);
$user->setup('viewforum');


$text = "[b]bold text here[/b] not bold here";

$uid = $bitfield = $options = '';
echo("parsing");
echo generate_text_for_storage($text, $uid, $bitfield, $options, true, true, true);
var_dump($text);
$text = generate_text_for_display($text, $uid, $bitfield, OPTION_FLAG_BBCODE );
var_dump($text);
echo("finished");

Какие выходы

parsing
string '[b:1vhn6cjx]bold text here[/b:1vhn6cjx] not bold here' (length=53)
array (size=1)
  0 => int 1
string '<span style="font-weight: bold">bold text here</span> not bold here' (length=67)
finished

Преобразование bb-кода — это двухэтапный процесс, позволяющий как пользователю, так и автору настроить вид публикации. Вам нужно будет сначала обработать текст с помощью первой функции, а затем обработать второй раз, чтобы получить html.

person exussum    schedule 26.02.2014
comment
Изменение на генерацию для отображения тоже не работает, и ваш альтернативный код тоже почему-то не работает! (Я не могу получить никаких ошибок!) - person Tom Gullen; 26.02.2014
comment
Поместите в ответ некоторый рабочий код с ошибками отображения, чтобы, надеюсь, вы могли увидеть больше, если ваш не работает. - person exussum; 27.02.2014
comment
@TomGullen повезло с этим? - person exussum; 27.02.2014

Способ сделать это самостоятельно может заключаться в использовании регулярных выражений для поиска тегов BBCode и захвата того, что находится между двумя тегами.

Вот пример с жирным шрифтом:

$text = "[b]bold text here[/b] not bold here but still [b]bold here[/b]";

$pattern = '/\[b\](.*?)\[\/b\]/i';
$replacement = '<b>$1</b>';
echo preg_replace($pattern, $replacement, $text);

Выход: <b>bold text here</b> not bold here but still <b>bold here</b>.

Подробнее о preg_replace.

Вы можете заметить, что токен *? делает захват ленивым, а не жадным, таким образом работая для нескольких тегов в одной строке.

Это регулярное выражение также будет работать (после небольшого изменения) для курсивного и подчеркнутого текста. Но вам придется написать другой для ссылок, списков или изображений. Список тегов BB-кода можно найти в Википедии: теги BB-кода. На той же странице вы найдете примеры HTML-кода для каждого типа тегов, которые вам очень помогут!

Теперь есть библиотека для разбора PHP BBCode. Это сэкономит вам много времени и, вероятно, будет более эффективным, чем использование регулярных выражений.

Вот два примера библиотек: PECL и PEAR.

person Theox    schedule 24.02.2014
comment
Спасибо, но я хочу использовать анализатор кода PHPBB BB, поэтому мне не нужно писать свой собственный / поддерживать его! - person Tom Gullen; 24.02.2014
comment
Кроме того, если вы использовали эту версию, а я знаю, что это только пример, мы можем использовать тег img. - person ʰᵈˑ; 26.02.2014

Вот как я получил рабочую версию на основе вашего опубликованного кода...

1) Установил PHPBB3 на свой локальный веб-сервер... Это: XAMPP, PHP 5.3.18 на Windows XP.

2) Проверил, что все работает, создавая форумы и отправляя сообщения как «гость».

Все нормально, пока...

Затем я отредактировал свой файл «index.php», чтобы «включить» все стандартные материалы «PHPBB3», но удалил весь код отображения.

Затем я включил ваш код и проверил каждый шаг.

<?php
/**
*
* @package phpBB3
* @version $Id$
* @copyright (c) 2005 phpBB Group
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/

/**
* @ignore
*/
define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);
include($phpbb_root_path . 'includes/functions_display.' . $phpEx);

echo '<br />----------------------------------------------<br />';
echo "Hello from PHPBB3! Start<br />"; // show starting

// note that multibyte support is enabled here
$sampleText = "[b]bold text here[/b] not bold here";
var_dump($sampleText . ' : '. __FILE__ . __LINE__);


$myNormalizeText = utf8_normalize_nfc($sampleText);

var_dump($myNormalizeText .' : '. __FILE__. __LINE__);

// variables to hold the parameters for submit_post
$uid = $bitfield = $options = '';

echo("<br />parsing Start<br/>");
    generate_text_for_storage($myNormalizeText, $uid, $bitfield, $options, true, true, true);

    var_dump($myNormalizeText .' :'. __FILE__. __LINE__);
    var_dump($uid .' :'. __FILE__. __LINE__);
echo("<br />Parsing finished<br/>");

echo "<br />Goodbye from PHPBB3! END";
echo '<br />----------------------------------------------<br />';
?>

Вывод:

----------------------------------------------
Hello from PHPBB3! Start

string '[b]bold text here[/b] not bold here : P:\developer\xampp\htdocs\phpBB3\index.php25' (length=82)

string '[b]bold text here[/b] not bold here : P:\developer\xampp\htdocs\phpBB3\index.php33' (length=82)


parsing Start

string '[b:vkw79dbw]bold text here[/b:vkw79dbw] not bold here :P:\developer\xampp\htdocs\phpBB3\index.php41' (length=99)

string 'vkw79dbw :P:\developer\xampp\htdocs\phpBB3\index.php42' (length=54)


Parsing finished

Goodbye from PHPBB3! END
------------------------

Кажется, он делает то, что просили.

person Ryan Vincent    schedule 24.02.2014
comment
Привет, Райан, у меня это вообще не работает, и твое решение, похоже, не выводит HTML? - person Tom Gullen; 26.02.2014
comment
О, я даже запускаю приведенный выше код через веб-сервер! Это прилагаемый файл index.php, измененный, как указано выше! - person Ryan Vincent; 27.02.2014

Этот код работал у меня: не на 100% точен, но помогает: благодаря https://gist.github.com/neo22s/2584465

, с небольшими изменениями

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT post_id, post_text from phpbb_posts"; //adjust phpbb_
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {
        $converted_post_text=tohtml($row['post_text']);
        $post_id=$row['post_id'];
        $updated_sql="UPDATE phpbb_posts SET post_text='".$converted_post_text."' WHERE post_id='".$post_id."'";
        $conn->query($updated_sql);
        echo $post_id . 'Done '. $converted_post_text;
        echo '<br>';

        sleep(1);
    }
} else {
    echo "0 results";
}
$conn->close();





function tohtml($text,$advanced=true,$charset='utf-8'){

        //special chars
        $text  = htmlspecialchars($text, ENT_QUOTES,$charset);

        /**
         * This array contains the main static bbcode
         * @var array $basic_bbcode
         */
        $basic_bbcode = array(
                                '[b]', '[/b]',
                                '[i]', '[/i]',
                                '[u]', '[/u]',
                                '[s]','[/s]',
                                '[ul]','[/ul]',
                                '[li]', '[/li]',
                                '[ol]', '[/ol]',
                                '[center]', '[/center]',
                                '[left]', '[/left]',
                                '[right]', '[/right]',
        );

        /**
         * This array contains the main static bbcode's html
         * @var array $basic_html
         */
        $basic_html = array(
                                '<b>', '</b>',
                                '<i>', '</i>',
                                '<u>', '</u>',
                                '<s>', '</s>',
                                '<ul>','</ul>',
                                '<li>','</li>',
                                '<ol>','</ol>',
                                '<div style="text-align: center;">', '</div>',
                                '<div style="text-align: left;">',   '</div>',
                                '<div style="text-align: right;">',  '</div>',
        );

        /**
         *
         * Parses basic bbcode, used str_replace since seems to be the fastest
         */
        $text = str_replace($basic_bbcode, $basic_html, $text);

        //advanced BBCODE
        if ($advanced)
        {
            /**
             * This array contains the advanced static bbcode
             * @var array $advanced_bbcode
             */
            $advanced_bbcode = array(
                                     '#\[color=([a-zA-Z]*|\#?[0-9a-fA-F]{6})](.+)\[/color\]#Usi',
                                     '#\[size=([0-9][0-9]?)](.+)\[/size\]#Usi',
                                     '#\[quote](\r\n)?(.+?)\[/quote]#si',
                                     '#\[quote=(.*?)](\r\n)?(.+?)\[/quote]#si',
                                     '#\[url](.+)\[/url]#Usi',
                                     '#\[url=(.+)](.+)\[/url\]#Usi',
                                     '#\[email]([\w\.\-]+@[a-zA-Z0-9\-]+\.?[a-zA-Z0-9\-]*\.\w{1,4})\[/email]#Usi',
                                     '#\[email=([\w\.\-]+@[a-zA-Z0-9\-]+\.?[a-zA-Z0-9\-]*\.\w{1,4})](.+)\[/email]#Usi',
                                     '#\[img](.+)\[/img]#Usi',
                                     '#\[img=(.+)](.+)\[/img]#Usi',
                                     '#\[code](\r\n)?(.+?)(\r\n)?\[/code]#si',
                                     '#\[youtube]http://[a-z]{0,3}.youtube.com/watch\?v=([0-9a-zA-Z]{1,11})\[/youtube]#Usi',
                                     '#\[youtube]([0-9a-zA-Z]{1,11})\[/youtube]#Usi'
            );

            /**
             * This array contains the advanced static bbcode's html
             * @var array $advanced_html
             */
            $advanced_html = array(
                                     '<span style="color: $1">$2</span>',
                                     '<span style="font-size: $1px">$2</span>',
                                     "<div class=\"quote\"><span class=\"quoteby\">Disse:</span>\r\n$2</div>",
                                     "<div class=\"quote\"><span class=\"quoteby\">Disse <b>$1</b>:</span>\r\n$3</div>",
                                     '<a rel="nofollow" target="_blank" href="$1">$1</a>',
                                     '<a rel="nofollow" target="_blank" href="$1">$2</a>',
                                     '<a href="mailto: $1">$1</a>',
                                     '<a href="mailto: $1">$2</a>',
                                     '<img src="$1" alt="$1" />',
                                     '<img src="$1" alt="$2" />',
                                     '<div class="code">$2</div>',
                                     '<object type="application/x-shockwave-flash" style="width: 450px; height: 366px;" data="http://www.youtube.com/v/$1"><param name="movie" value="http://www.youtube.com/v/$1" /><param name="wmode" value="transparent" /></object>',
                                     '<object type="application/x-shockwave-flash" style="width: 450px; height: 366px;" data="http://www.youtube.com/v/$1"><param name="movie" value="http://www.youtube.com/v/$1" /><param name="wmode" value="transparent" /></object>'
            );

            $text = preg_replace($advanced_bbcode, $advanced_html,$text);
        }

        //before return convert line breaks to HTML
        return $text;

    }

?>
person wpcoder    schedule 05.10.2016