php 开源 wordpress 编程 mysql centos Firefox shell 程序员 云计算 linux Ubuntu Windows Python Android 微软 google apache java nginx

Bo-Blog 2.1.1 与SyntaxHighlighter 插件中HTML冲突问题

前两天在写[原]Python 框架TurboGears 2 入门文档《Wiki Tutorial》翻译校正一文时,发现若在代码段【codes】中使用html 标记,会出现代码最后出现一些垃圾标记。经排查,原来是Bo-Blog 2.1.1 与SyntaxHighlighter 插件中HTML部分冲突的问题。在修改Bo-Blog 的代码后,问题解决。

一、问题

编写日志时,使用【codes=html】和【/codes】对HTML 代码进行标记。但在查看日志时,发现HTML 代码后面有一长串的垃圾字符串,如图:

点击在新窗口中浏览此图片

重新编辑日志,日志中的内容是正常的,可见问题出在程序输出显示部分。

二、排查问题

为了便于查看代码,我使用的是dphighlighter(dp.SyntaxHighlighter For UBB)插件,而在日常的使用中,如C、Python、PHP的代码时都没发现异常问题,只有这次HTML 代码比较奇怪。

从上图中被追加的垃圾尾部信息来看,额外添加的是runtime 信息,怀疑是程序在输出模板时,替换字符串导致的。

检查Bo-Blog 的代码,发现index.php 中有以下内容:

//Running time  
if ($mbcon['runtime']==1) {  
  $endtime=getmicrotime();  
  $runtimeamount=$endtime-$begintime;  
  $runtimeamount=floor($runtimeamount*1000);  
  $gzipplus=($config['gzip']==1) ? ', Gzip enabled' : '';  
  $runtimedisplay="<script type='text/javascript'>rn//<![CDATA[rnif (document.getElementById('processtime')) document.getElementById('processtime').innerHTML="<span class='runtimedisplay'>Run in {$runtimeamount} ms, {$querynum} Queries{$gzipplus}.</span>";rn//]]>rn</script>";  
  $tt=str_replace('</body>', $runtimedisplay.'</body>', $tt);  
}  
echo $tt;  

关键是最后一行的str_replace() 函数替换,这里只要匹配上body结尾标签,就会被追加$runtimedisplay 的输出,正是导致问题的原因。(出问题的HTML代码正是包含body 结尾标签的)

再看看模板的HTML 代码部分。我当前使用的是meSimple 样式模板,从template/meSimple 目录下的elements.php 文件,可以看到以下内容:

$elements['displayfooter']=<<<eot  
        </div>  
                <div id="footer">  
                        <div id="innerFooter">  
  
                                <!-- 使用本模板请遵守共同创作公约,尊重作者版权,在本作品下衍生和分享需要保留或注明出处和作者链接。-->  
                                Copyright ? 2005-2008 迷·拾壹月 All rights reserved. | Template By <a href="http://www.menov.net" target="_blank">Eiker</a> | {secc  
tion_foot_components}  
  
                        <div id=" processtime">  
                        </div>  
                        </div>  
                </div>  
        </div>  
</div>  
eot;  
  
$elements['footer']=<<<eot  
<script type="text/javascript">  
loadSidebar();  
</script>  
</body>  
</html>  
eot;  
//Running time  
if ($mbcon['runtime']==1) {  
        $endtime=getmicrotime();  
        $runtimeamount=$endtime-$begintime;  
        $runtimeamount=floor($runtimeamount*1000);  
        $gzipplus=($config['gzip']==1) ? ', Gzip enabled' : '';  
        $runtimedisplay="<div id="processtime"><span class='runtimedisplay'>Run in {$runtimeamount} ms, {$querynum} Queries{$gzipplus}.</span>";  
        $tt=str_replace('<div id=" processtime">', "$runtimedisplay", $tt);  
}  
echo $tt;

延伸阅读

评论