CKEditor不需要的 字符

48

我如何禁用CKEditor,使其不会每次在我不需要它们时插入 ?我正在使用带有jQuery适配器的CKEditor。

我不想要任何 标签。


1
它如何知道你想要哪些,不想要哪些?你想要删除它们全部,还是减少重复,或者其他什么?它们最初是怎么到达那里的? - Wesley Murch
我只是不想它们被添加...所有的都不要。 - V.Rashkov
好的,我只是想澄清一下。所以当用户按下空格键时,它永远不会添加超过一个空格吗?换句话说,您不希望在服务器端执行此操作,对吗?我想最好的方法是将它们全部转换为普通空格(以防一些空格分隔两个单词),但我不确定如何在 ckeditor 中实现它。 - Wesley Murch
当我加载一些HTML,进入编辑器的所见即所得部分,然后返回到编辑器的HTML部分时,它会在许多地方添加nbsp标签。我知道它为什么会添加它们,我已经搜索了这个问题,但没有解决方案起作用。 - V.Rashkov
4
它还会在空表格单元格中添加  ,这会破坏某些电子邮件的设计。 - aaandre
10个回答

61
在进行了一些研究后,我可能会为这个问题提供一些线索 - 不幸的是,没有现成的解决方案。 在CKEditor中,有四种情况可能出现不间断空格(还有其他吗?):
  1. Automatic filling of empty blocks. This can be disabled in the config:

    config.fillEmptyBlocks = false;
    
  2. Automatic insertion when pressing TAB-key. This can be disabled in the config:

    config.tabSpaces = 0;
    
  3. Converting double spaces to SPACE+NBSP. This is a browser behavior and will thus not be fixed by the CKEditor team. It could be fixed serverside or by a clientside javascript onunload. Maybe this php is a start:

    preg_replace('/\s \s/ig', ' ', $text);
    
  4. By copy & paste. If you paste a UTF-8 no-break space or double-spaces CKEditor will convert it automatically. The only solution I see here is doing a regex as above. config.forcePasteAsPlainText = true; doesn't help.

摘要:为了消除所有不间断空格,您需要编写一个额外的函数来清理用户输入。
注:欢迎提出评论和进一步建议!(我正在使用 ckeditor 3.6.4)

3
config.fillEmptyBlocks = false; 可以防止自动插入   到空表格单元格中。谢谢! - aaandre
8
config.fillEmptyBlocks = false; 对我来说并没有解决问题。 - dsdsdsdsd
一个Webkit bug,在格式化或删除单词中间时会出现问题,详见此CK-ticket以获取清晰的示例描述。 - Yahoo Serious
2
我认为你的正则表达式应该是/\s* \s*/ig,以便在字符串中替换多个实例,并考虑到更多将空格与 混合的情况。因此,像西瓜 味道 饮料(这种情况经常发生)将被替换,而使用你的正则表达式则不会。此外,在每个\s前面应该使用*,因为HTML只渲染一个空格。 - dhaupin
对于我的CKEditors,“config.fillEmptyBlocks = false;”无效,但“config.basicEntities = false;”有效。 - Brendan Metcalfe

11

尝试:

config.basicEntities = false;

对我来说解决了问题。


@gabriel已经在17个月以前的回答中包含了这一点。在他的答案下发表评论(并点赞)会更好,因为重复是多余的、浪费读者的时间,而且会让你看起来没有检查其他的答案。 - Nick Rice
2
请参见我在@gabriel答案中关于basicEntities=false允许任意HTML的评论。 - Nick Rice
2
我相信他的回答直截了当,仅凭这一行就解决了问题,没有不必要的干扰。 - Emad Ha

11

还有一种情况会出现不间断空格字符,就是在句子末尾输入一个空格。

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


6
config.basicEntities = false将防止已输入的HTML代码被转义,因此人们可以输入本应被过滤或变得无害的HTML代码。正如您所说,它会阻止“ gt”和“ lt”被转义,但实际上您不应该信任任何用户输入的数据,即使是通过ckEditor输入的数据。我认为这值得一提。 - Nick Rice

4
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 );


3
我注意到一些文本编辑操作,比如按下退格键删除一个字符,会将编辑的文本节点分成两个。在这样新创建的文本节点的末尾按空格键总是会导致&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();
        }
    });
 });

2

这是一个糟糕的解决方案。

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

这是正确的解决方案

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

0

我已经不得不在 config.js 文件中进行调整,为了解决 Safari 中出现“?”的问题,最终我在 config.js 文件中添加了3行代码。

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

0
我在创建一些表格时遇到了相同的问题。我发现,如果使用CSS规则align="left"创建表格,则会添加<p>&nbsp;</p>,但是如果将CSS规则更改为align="center",则可以将段落编辑掉,并且它们不会再次添加。

-3
如果你正在使用PHP,你可以使用以下代码:
preg_replace("/[\<]p[\>][\s]+&nbsp;[\<][\/]p[\>]/" , " " , $pre_comment);

这将会移除:"<p> &nbsp;</p>"

享受吧 :)

Maxwell


11
我不想将此答案投下反对票,因为你是新来的,但请记住... 1. 此问题已经得到正确回答!(当你没有更好的答案时,请不要回答,并尤其注意老问题)2. 这个模式包含不必要的[]括号(所有的),不必要的转义序列\>,很可能还有\<和在\s后面不必要的+(模式~<p>\s&nbsp;</p>~看起来更短)。3. 如果您想确保P标签内只有一个普通空格,则将大小写不敏感的模式~<p>\s*&nbsp;\s*</p>~i替换为SPACE是一个更好的建议(而且更短)。 - Wh1T3h4Ck5

-3
将以下代码添加到您的config.js文件中:
config.enterMode = CKEDITOR.ENTER_BR,

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接