CKEditor 不需要的字符

Posted

技术标签:

【中文标题】CKEditor 不需要的字符【英文标题】:CKEditor unwanted   characters 【发布时间】:2012-04-02 06:04:30 【问题描述】:

当我不想要它们时,如何禁用 CKEditor 以让我每次 ?我正在使用 CKEditor 和 jQuery 适配器。

我不想有任何  标签。

【问题讨论】:

它如何知道哪些是你想要的,哪些是你不想要的?您要删除它们全部,还是减少倍数或其他?他们最初是如何到达那里的? 我只是不想添加它们.. 全部 好的,只是想澄清一下。那么当用户按下空格键时,它永远不会添加多个空格?换句话说,您不想在服务器端执行此操作,对吗?我想最好的方法是将它们全部变成常规空格(以防有些分隔两个单词),但我不确定如何专门使用 ckeditor 来做到这一点。 当我加载一些 html 时,转到编辑器的所见即所得部分,然后返回编辑器的 html 部分 - 它正在添加 nbsp 标签,到很多地方,我知道它为什么添加它们,我已经搜索过这个问题,但没有解决办法 它还添加了  在空的表格单元格中,这会破坏一些电子邮件设计。 【参考方案1】:

经过一些研究,我可能会对这个问题有所了解 - 不幸的是,没有现成的解决方案。

在 CKEditor 中有四种方式可以出现不间断空格(有人知道更多吗?):

    Automatic filling of empty blocks。这可以在配置中禁用:

    config.fillEmptyBlocks = false;
    

    Automatic insertion when pressing TAB-key。这可以在配置中禁用:

    config.tabSpaces = 0;
    

    将双倍空格转换为 SPACE+NBSP。 This is a browser behavior and will thus not be fixed by the CKEditor team。它可以是固定的服务器端或客户端javascript onunload。也许这个 php 是一个开始:

    preg_replace('/\s \s/ig', ' ', $text);
    

    通过复制和粘贴。如果您粘贴 UTF-8 no-break space 或双空格,CKEditor 将自动转换它。我在这里看到的唯一解决方案是像上面那样做一个正则表达式。 config.forcePasteAsPlainText = true; 没有帮助。

总结:要摆脱所有不间断空格,您需要编写一个额外的函数来清理用户输入。

非常感谢您的评论和进一步的建议! (我使用的是 ckeditor 3.6.4)

【讨论】:

config.fillEmptyBlocks = false;照顾  自动插入到空的表格单元格中。谢谢! config.fillEmptyBlocks = false; 并没有阻止我的问题 A Webkit bug 格式化或删除中间词时,请参阅 this CK-ticket 以获得清晰的示例描述。 我认为您的正则表达式可能应该是 /\s* \s*/ig 以替换字符串中的多个实例,并考虑更多将空间与   混合的场景。因此,watermelon  flavored  drink 之类的东西(可能经常发生)会被替换,而使用您的正则表达式则不会。此外,每个 \s 前面都应使用 *,因为无论如何 html 只会呈现一个空格。 对于我的 CKEditors,'config.fillEmptyBlocks = false;'没用,但 'config.basicEntities = false;'做了【参考方案2】:

如果您使用的是 PHP,您可以使用以下代码:

preg_replace("/[\<]p[\>][\s]+&nbsp;[\<][\/]p[\>]/" , " " , $pre_comment);

这将删除:"&lt;p&gt; &amp;nbsp;&lt;/p&gt;"

享受:)

麦克斯韦

【讨论】:

我不想对这个答案投反对票,因为您是新来的,但请记住...1. 问题已经正确回答! (当你没有更好的答案时,根本不回答,尤其是老问题)2. 这个模式包含不必要的[] 括号(所有这些),不必要的转义序列\&gt;,很可能是@987654327 @ 和 \s 之后不必要的 +(模式 ~&lt;p&gt;\s&amp;nbsp;&lt;/p&gt;~ 看起来更短吧?)。 3. 如果您想确保在 P 标记内有一个常规空格,则将 ~&lt;p&gt;\s*&amp;nbsp;\s*&lt;/p&gt;~i 不区分大小写地替换为 SPACE 是更好的建议(并且更短)。【参考方案3】:

将此添加到您的config.js

config.enterMode = CKEDITOR.ENTER_BR,

【讨论】:

【参考方案4】:

还有另一种方式可以出现不间断空格字符。只需在句末输入一个空格即可。

CKEditor 转义基本的 HTML 实体以及拉丁语和希腊语实体。

添加这些配置选项以防止这种情况发生(您也可以在配置文件中添加它们):

CKEDITOR.on( 'instanceCreated', function( event ) 
 editor.on( 'configLoaded', function() 

  editor.config.basicEntities = false;
  editor.config.entities_greek = false; 
  editor.config.entities_latin = false; 
  editor.config.entities_additional = '';

 );
);

这些选项将防止 CKEditor 转义 nbsp gt lt amp ' " 其他拉丁和希腊字符。

来源: http://docs.ckeditor.com/#!/api/CKEDITOR.config http://docs.ckeditor.com/source/plugin48.html#CKEDITOR-config-cfg-basicEntities

【讨论】:

config.basicEntities = false 将防止键入的 HTML 被转义,因此人们将能够简单地键入 HTML,否则将被过滤/呈现无害。 (这是隐含的,因为您说它会阻止 gt 和 lt 被转义,实际上您不应该信任任何用户输入的数据,即使它来自 ckEditor,但认为值得一提。)【参考方案5】:

我在创建一些表时遇到了同样的问题。我看到的是,如果我使用 css 规则 align="left" 创建表格,则会添加 &lt;p&gt;&amp;nbsp;&lt;/p&gt;,但如果我将 css 规则更改为 align="center",我可以将段落编辑出来,并且不会再次添加它们。

【讨论】:

【参考方案6】:

试试:

config.basicEntities = false;

为我解决了问题。

【讨论】:

@gabriel 在您添加此内容之前 17 个月已将其包含在他的答案中。对他的答案发表评论(和赞成)会更好,因为重复它是多余的并且浪费读者的时间,更不用说它看起来像你没有检查其他答案。 另请参阅我对 basicEntities=false 的评论,让@gabriel 的答案通过任意 HTML。 我相信他的回答直截了当,仅这一行就解决了问题,没有不必要的分心【参考方案7】:

我注意到一些文本编辑操作,比如删除一个字符(通过点击 Backspace 按钮)将编辑的文本节点一分为二。在这种新创建的文本节点的末尾点击空格键总是会导致 &amp;nbsp; 而不是正常的空格。我打电话给normalize()http://www.w3schools.com/jsref/met_node_normalize.asp 更改后的元素:

CKEDITOR.on('instanceReady', function (ck) 
    ck.editor.on("change", function (e) 
        var sel = ck.editor.getSelection();
        if (sel) 
            var selected = sel.getStartElement();
            if (selected && selected.$)
                sel.getStartElement().$.normalize();
        
    );
 );

【讨论】:

【参考方案8】:

config.js 中:

CKEDITOR.editorConfig = function( config ) 
  config.enterMode = CKEDITOR.ENTER_BR; // <p></p> to <br />
  config.entities = false;
  config.basicEntities = false;
;

它对我有用,你可以用 php 打印文本:html_entity_decode( $someText );

【讨论】:

【参考方案9】:

我已经不得不使用 config.js,所以为了修复 '?'出现在 safari 我最终在 config.js 中有 3 行

config.fillEmptyBlocks = function (element) 
return true; // DON'T DO ANYTHING!!!!!;
config.entities = false;
config.basicEntities = false;

【讨论】:

【参考方案10】:

这是一个糟糕的解决方案

config.basicEntities = false;
因为它不允许您将 JS 代码作为文本插入到表单中。像那样&lt;script type="text/javascript" src="/scripts/redactor/ckeditor/ckeditor.js"&gt;&lt;/script&gt; 此外,像&lt;p&gt;&amp;nbsp;&lt;/p&gt; 这样的空块不能在文本中指定缩进,因为字符&amp;nbsp; 将被删除(config.fillEmptyBlocks = true;)

这是正确的解决方案

$text = preg_replace("#([^>])&nbsp;#ui", "$1 ", $text);
这是一个 PHP 函数,用于替换空格上的所有字符 &amp;nbsp;,除了那些在标签内的字符,如 &lt;p&gt;&amp;nbsp;&lt;/p&gt; 函数代码不是最优雅的,你可以建议自己的版本。

【讨论】:

以上是关于CKEditor 不需要的字符的主要内容,如果未能解决你的问题,请参考以下文章

需要在CKEditor中的p标签中添加contentEditable = false

CKEditor粘贴图片上传功能

CKEditor 图片上传

django-ckeditor:不包括ckeditor js文件

CKEditor/FCKEditor的使用

将 Arial Unicode MS 添加到 CKEditor