phpBB3.2.X BBCode处理机制

在这里讨论PHPBB3.2.X相关的使用、安装等话题
版面规则
再次重申: 请不要用站内信件问问题, 有问题直接发到相应版面上, 今后任何此类信件恕不回复.
发表回复
头像
IOsetting
论坛管理员
论坛管理员
帖子: 3628
注册: 2006-10-17 1:48

phpBB3.2.X BBCode处理机制

帖子 IOsetting » 2018-12-06 13:27

在phpBB3.2.X中, BBCode的处理已经更换成了 phpbb\textformatter\s9e, 在functions_content.php 中的 generate_text_for_display() 方法中还保留了对旧BBCode的兼容, 是根据是否存在<r> 或者 <t> 这样的标签来判断的

代码: 全选

	if (preg_match('#^<[rt][ >]#', $text))
	{
		$renderer = $phpbb_container->get('text_formatter.renderer');

		// Temporarily switch off viewcensors if applicable
		$old_censor = $renderer->get_viewcensors();

		// Check here if the user is having viewing censors disabled (and also allowed to do so).
		if (!$user->optionget('viewcensors') && $config['allow_nocensors'] && $auth->acl_get('u_chgcensors'))
		{
			$censor_text = false;
		}

		if ($old_censor !== $censor_text)
		{
			$renderer->set_viewcensors($censor_text);
		}

		$text = $renderer->render($text);

		// Restore the previous value
		if ($old_censor !== $censor_text)
		{
			$renderer->set_viewcensors($old_censor);
		}
	}
	else
	{
		if ($censor_text)
		{
			$text = censor_text($text);
		}

		// Parse bbcode if bbcode uid stored and bbcode enabled
		if ($uid && ($flags & OPTION_FLAG_BBCODE))
		{
			if (!class_exists('bbcode'))
			{
				global $phpbb_root_path, $phpEx;
				include($phpbb_root_path . 'includes/bbcode.' . $phpEx);
			}

			if (empty($bbcode))
			{
				$bbcode = new bbcode($bitfield);
			}
			else
			{
				$bbcode->bbcode_set_bitfield($bitfield);
			}

			$bbcode->bbcode_second_pass($text, $uid);
		}

		$text = bbcode_nl2br($text);
		$text = smiley_text($text, !($flags & OPTION_FLAG_SMILIES));
	}
在新的BBCode机制下, 在数据库中存储的实际上是一个XML格式的文本, 对文本中的BBCode标签做了解析, 打上XML标签. 这一步应该是为了方便显示时, 利用PHP内建的DOM解析工具, 这是一个实际存储的例子

代码: 全选

<r>== V1.0.0 RC1  == <br/>
<br/>
<B><s>[b]</s>说明<e>[/b]</e></B><br/>
phpBB3c 是基于官方3.0.14版本开发的phpBB3修订版, 项目使用GPL v2协议, 代码位于Github, <URL url="viewtopic.php?f=5&amp;t=3949"><s>[url=viewtopic.php?f=5&amp;t=3949]</s>查看项目说明<e>[/url]</e></URL> <br/>
<COLOR color="#FF0000"><s>[color=#FF0000]</s>注意: 这不是官方版本.<e>[/color]</e></COLOR><br/>
<br/>
<B><s>[b]</s>日志<e>[/b]</e></B>
<LIST><s>[list]</s><LI><s>[*]</s>兼容PHP7 (已经在PHP7.2.0下测试)</LI>
<LI><s>[*]</s>优化模板机制, 改为完全基于文件, 不再使用DB存储. DB机制给调试和修改造成诸多麻烦, 还不能充分利用浏览器缓存</LI>
<LI><s>[*]</s>升级为3.2.X的界面. 支持响应式布局, 用文字替代语言按钮, 并且支持语言相关的CSS调节</LI><e>[/list]</e></LIST>

<B><s>[b]</s>目的<e>[/b]</e></B><br/>
项目的目标, 是在3.0.X分支上建立高效的, 简洁的, 更适合中文用户的论坛软件. 相对于3.1.X和3.2.X, 3.0.X的代码大小, 运行效率和修改简易度上都有很大的优势, 而且经过长达十年的运行, 3.0.X的安全性已经经过了充分的检验, 对于不希望升级到3.1.X的用户, 这是一个很好的选择. <br/>
<br/>
<B><s>[b]</s>下载<e>[/b]</e></B><br/>
<URL url="https://github.com/MiltonLai/phpbb3c/releases/download/v1.0.0-rc1/phpbb3c_v1.0.0-rc1.tar.bz2"><s>[url=https://github.com/MiltonLai/phpbb3c/releases/download/v1.0.0-rc1/phpbb3c_v1.0.0-rc1.tar.bz2]</s>下载地址<e>[/url]</e></URL> <URL url="http://www.phpbbchina.com/download/phpbb3c_v1.0.0-rc1.tar.bz2"><s>[url=http://www.phpbbchina.com/download/phpbb3c_v1.0.0-rc1.tar.bz2]</s>本地下载<e>[/url]</e></URL><br/>
<br/>
<B><s>[b]</s>安装<e>[/b]</e></B><br/>
安装方法与phpBB3.0.X系列完全相同. <br/>
若从已经存在的phpBB3.0.X论坛升级, 请先升级至官方3.0.14版本, 再以新路径运行此论坛, 检测正常后替换旧版本(注意保存附件和头像文件).</r>
可以看到, 里面的格式是
文档开始结束标签: <r></r>
内部元素标签: <B><s></s><e></e></B>, <URL url=""><s></s><e><e></URL>, 等等, 不再使用之前的 bitfield, uid 机制.

发表回复