解析PHPBB3的BB代码

时间:2014-02-21 16:27:20

标签: php bbcode phpbb3

希望使用PHPBB3的函数解析PHP中的BB代码。我到目前为止:

<?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

任何帮助都非常感谢!

修改

没有答案仍然有效。我正在寻找一个独立 php页面,该页面使用PHPBB3的BBCode解析器将给定的BB代码字符串转换为HTML字符串。

4 个答案:

答案 0 :(得分:2)

生成bbcodes是一个两步过程,你做的第一步(第一次通过)

generate_text_for_storage用于将bbcode存储在数据库中,它存储为bbcode,因为你可以更改bbcode而无需重新分析旧消息。

您正在寻找的其他功能

generate_text_for_display

PHPBB有一个wiki列出了这样的东西

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

答案 1 :(得分:0)

自己这样做的方法可能是使用正则表达式来查找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 Code tags。在同一页面上,您将找到每种标签的示例HTML代码,这对您真有帮助!

现在,有一个PHP BBCode解析库。这将为您节省大量时间,并且可能比使用正则表达式更具性能。

以下是两个库示例:PECLPEAR

答案 2 :(得分:0)

以下是我根据您发布的代码获得的工作版本...

1)将PHPBB3安装到我的本地Web服务器上...... 这是:Windows XP上的XAMPP,PHP 5.3.18。

2)通过创建论坛并将消息发布为“来宾”来检查所有内容。

一切都好,到目前为止......

然后我将'index.php'文件编辑为'include'所有标准的'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
------------------------

似乎按照要求行事。

答案 3 :(得分:0)

这段代码对我有用: 不是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;

    }

?>