【问题标题】:How to define allowed tags in CKEditor?如何在 CKEditor 中定义允许的标签?
【发布时间】:2011-02-24 03:55:13
【问题描述】:
  • 有时用户将文本从不同来源复制并粘贴到 CKEditor,但我想限制他们可以复制到 CKEditor 的标签。

  • 我只需要在CKEditor中使用某些标签:列表标签、中断标签等...

  • 我可以在 CKEditor 中定义它们并禁用其他标签吗?

【问题讨论】:

标签: ckeditor


【解决方案1】:

您可以使用一些设置。您可以在 ckeditor 的根目录中编辑 config.js 文件来定义这些设置。例如,如果你想像我一样激进,你可以说:

config.forcePasteAsPlainText = true;

如果你只想像你说的那样限制某些标签,我找到了下面的设置:

config.removeFormatTags = 'b,big,code,del,dfn,em,font,i,ins,kbd';

只有在用户执行“删除格式”命令时才会完成最后一项。 更多信息:http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.config.html#.format_tags

考虑到一直以来,我认为您已经找到了答案,但可以帮助其他人。

【讨论】:

【解决方案2】:

我这样做只是为了确保没有人可以在编辑器中添加<input> 标签。它可能会扩展到其他标签:

            CKEDITOR.on('instanceReady', function(ev)
            {
                var editor = ev.editor;
                var dataProcessor = editor.dataProcessor;
                var htmlFilter = dataProcessor && dataProcessor.htmlFilter;
                htmlFilter.addRules(
                {
                    elements : 
                    {
                        input: function(element)
                        {
                            return false;
                        },
                    }
                });
            });

【讨论】:

【解决方案3】:

我使用 phpjs.org 中的 strip_tags 方法将有限的 html 标签选择直接应用于粘贴操作。

CKEDITOR.on('instanceReady', function(ev) {
   ev.editor.on('paste', function(evt) {
      evt.data['html'] = strip_tags(evt.data['html'], 
         '<i><em><b><strong><blockquote><p><br><div><ul><li><ol>' // allowed list
      );
   });
});

function strip_tags (input, allowed) {
   // http://phpjs.org/functions/strip_tags (http://kevin.vanzonneveld.net)
   allowed = (((allowed || "") + "").toLowerCase().match(/<[a-z][a-z0-9]*>/g) || []).join(''); // making sure the allowed arg is a string containing only tags in lowercase (<a><b><c>)
   var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>/gi,
      commentsAndPhpTags = /<!--[\s\S]*?-->|<\?(?:php)?[\s\S]*?\?>/gi;
   return input.replace(commentsAndPhpTags, '').replace(tags, function ($0, $1) {
      return allowed.indexOf('<' + $1.toLowerCase() + '>') > -1 ? $0 : '';
   });
}

【讨论】:

  • 那是HTML的正则表达式解析吗?
  • 嘻嘻!我的天啊!可以吗?人间罪孽。实际上,它是剥离 HTML,而不是解析,这是 regex 非常适合的用途之一。
  • 对于 ckeditor 4 将 evt.data['html'] 替换为 event.data.dataValue
【解决方案4】:

您可以使用whitelist plugin 在您的配置中定义允许和拒绝其他任何内容的元素和属性列表。

这与 Paul Tomblin 提出的解决方案基本相同,但它应该更容易处理更多元素而不是复制大量代码,并且它使用白名单而不是黑名单,因此任何不允许的内容都会被删除。

【讨论】:

  • 将插件作为开源提供的好处应该是您可以改进它,甚至可以花钱请人做您需要的事情。即使用户拖放某些东西,输出也会保持干净,所以这只是一个部分错误,我们可以说问题是 CKEditor 没有像粘贴那样挂钩拖放。
  • 是的,我想我还是会使用它,谢谢。至于修复它,看到这个 ckeditor 错误在“wontfix”关闭似乎并不容易:dev.ckeditor.com/ticket/5473
【解决方案5】:
CKEDITOR.config.fullPage = false

指示要编辑的内容是否作为完整的 HTML 页面输入。整页包括&lt;html&gt;&lt;head&gt;&lt;body&gt; 元素。最终输出也将反映此设置,包括 &lt;body&gt; 内容,仅当此设置被禁用时。

【讨论】:

    【解决方案6】:

    要添加我的输入,从 4.1 开始就有高级内容过滤器功能,它允许对允许的内容(哪些标签以及它们的样式/属性/类)进行非常具体的规则。我发现它非常强大并且配置非常好。

    http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter 上阅读更多信息,但这里有一些来自页面的示例

    config.allowedContent = true; // to allow all
    
    // A rule accepting <p> and <h1> elements with optional "left" and "right" classes.
    // Note: Both elements may contain these classes, not only <h1>.
    config.allowedContent = "p h1(left,right)";
    
    // Rules allowing:
    // * <p> and <h1> elements with an optional "text-align" style,
    // * <a> with a required "href" attribute,
    // * <strong> and <em> elements,
    // * <p> with an optional "tip" class (so <p> element may contain
    //  a "text-align" style and a "tip" class at the same time).
    config.allowedContent = "p h1{text-align}; a[!href]; strong em; p(tip)";
    

    【讨论】:

      猜你喜欢
      • 2018-07-15
      • 1970-01-01
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      • 2022-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多