如何在 CKEditor 中定义允许的标签?

Posted

技术标签:

【中文标题】如何在 CKEditor 中定义允许的标签?【英文标题】:How to define allowed tags in CKEditor? 【发布时间】:2011-02-24 03:55:13 【问题描述】:

有时用户将文本从不同来源复制并粘贴到 CKEditor,但我想限制他们可以复制到 CKEditor 的标签。

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

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

【问题讨论】:

CKEditor 4 有一个全新的(花哨的)标签过滤系统:docs.ckeditor.com/#!/guide/dev_advanced_content_filter 【参考方案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

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

【讨论】:

forcePasteAsPlainText 并不总是有效,请参阅dev.ckeditor.com/ticket/756【参考方案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;
                        ,
                    
                );
            );

【讨论】:

更多信息在这里:docs.cksource.com/CKEditor_3.x/Developers_Guide/Data_Processor【参考方案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 h1text-align; a[!href]; strong em; p(tip)";

【讨论】:

以上是关于如何在 CKEditor 中定义允许的标签?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Nuxt.js 中使用 CKEditor - 未定义窗口错误

根据Selection - CKEditor更新RichCombo的标签

如何将“target”属性添加到ckeditor5中的`a`标签?

您如何定义 CKEditor 用于搜索配置/语言文件的路径?

Typo3/CKEditor:允许定义列表(dl、dt、dd)

如何将 CKEditor 自定义配置文件添加到 XPages?