希望使用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字符串。
答案 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解析库。这将为您节省大量时间,并且可能比使用正则表达式更具性能。
答案 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;
}
?>