将注释中的受限html转换为bbcode

时间:2015-11-20 作者:AntonChanning

Problem:出于安全原因,Wordpress multisite仅允许管理员帐户在html中包含图像。可以安装一个关闭这些限制的插件,但它显然会打开一大堆安全漏洞,所以我宁愿避免这种情况。我已经有了bbpress bbcodebbpress shortcode whitelist 已安装插件,这意味着用户可以使用[img]http://some.url/to/an/image[/img]. 然而,在缺少用于wordpress评论的良好bbcode工具栏的情况下,我还想使用MDC Comment Toolbar 插件,它使用html插入图像。因为在单个站点安装中,作者可以在评论中包含html,所以会显示“添加媒体”按钮。但由于其多站点,因此会将其删除。

Partial Solution:我突然想到要编写一个插件,使用preprocess_comment 要查找的挂钩img html标记并将其转换为bbcodes。但到目前为止,我正在努力让这项工作发挥作用。以下是我的插件到目前为止的内容。它使用XSLTProcessor 但我愿意接受其他想法。。。

function html2bbcode( $commentdata ) {
    $xhtml = $commentdata[\'comment_content\'];

    $xsl = <<<\'EOB\'
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text">
    <xsl:template match="img">[img="<xls:value-of select="@alt"/>"]<xls:value-of select="@src"/>[/img]</xsl:template>
</xsl:stylesheet>
EOB;

    $xmldoc = DOMDocument::loadHTML($xhtml);
    $xsldoc = DOMDocument::loadXML($xsl);

    $proc = new XSLTProcessor();
    $proc->registerPHPFunctions();
    $proc->importStyleSheet($xsldoc);
    $xhtml = $proc->transformToXML($xmldoc);

    $commentdata[\'comment_content\'] = $xhtml;
    return $commentdata;
}
add_filter( \'preprocess_comment\' , \'html2bbcode\' );
我真的不相信我的xsl是对的。无论输入什么,它似乎都会生成一个空字符串。但解决方案不一定要使用xsl。任何有用的东西。

1 个回复
最合适的回答,由SO网友:AntonChanning 整理而成

我最终用一种稍微不同的方法解决了这个问题。这允许用户在评论中包含图像。我还有一个问题,这确实是一个全新的问题,但在这里值得一提的是,可能不允许用户将新图像上传到帖子中,而只包括库中已有的图像。

function html2bbcode( $commentdata ) {
  if(!is_admin()) {
    $xhtml = $commentdata[\'comment_content\'];

    $parsed_comment = \'\';

    $dom = new DOMDocument();
    $dom->loadHTML($xhtml);
    $img_tags = $dom->getElementsByTagName(\'img\');

    foreach ($img_tags as $img) {
            $src = (string) $img->getAttribute(\'src\');
            if($src == \'\') {
                // No image src, no worries. 
            } else {
                $src = str_replace(\'"\', "", $src);
                $alt = (string) $img->getAttribute(\'alt\');
                $img_class = (string) $img->getAttribute(\'class\');

                $bbcode = \' [img=\'.$alt.\']\'.$src.\'[/img] \';

                    $divNode = $dom->createElement(\'div\');
                    $textNode = $dom->createTextNode($bbcode);
                    $divNode->appendChild($textNode);

                    $img->parentNode->replaceChild($divNode, $img);            
            }
    }
    $parsed_comment = $dom->saveHTML();
    $parsed_comment = str_replace(\'<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">\',\'\',$parsed_comment);

    $commentdata[\'comment_content\'] = $parsed_comment;

  }
  return $commentdata;
}
add_filter( \'preprocess_comment\' , \'html2bbcode\' );

相关推荐

Show comments in Backend

在我的网站上,我实现了每个用户都可以对网站上的每幅图片发表评论。因此,例如,可以对博客中的每幅图像进行评论。一切正常,我可以在前端显示它们。我的问题是,如何在后端显示它们?我可以在数据库中访问它们,就像在普通commentform中编写的注释一样。我希望我能清楚地解释我想要什么。如果没有,请问我。谢谢