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]+ [\<][\/]p[\>]/" , " " , $pre_comment);
这将删除:"<p> &nbsp;</p>"
享受:)
麦克斯韦
【讨论】:
我不想对这个答案投反对票,因为您是新来的,但请记住...1.
问题已经正确回答! (当你没有更好的答案时,根本不回答,尤其是老问题)2.
这个模式包含不必要的[]
括号(所有这些),不必要的转义序列\>
,很可能是@987654327 @ 和 \s
之后不必要的 +
(模式 ~<p>\s&nbsp;</p>~
看起来更短吧?)。 3.
如果您想确保在 P
标记内有一个常规空格,则将 ~<p>\s*&nbsp;\s*</p>~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"
创建表格,则会添加 <p>&nbsp;</p>
,但如果我将 css 规则更改为 align="center"
,我可以将段落编辑出来,并且不会再次添加它们。
【讨论】:
【参考方案6】:试试:
config.basicEntities = false;
为我解决了问题。
【讨论】:
@gabriel 在您添加此内容之前 17 个月已将其包含在他的答案中。对他的答案发表评论(和赞成)会更好,因为重复它是多余的并且浪费读者的时间,更不用说它看起来像你没有检查其他答案。 另请参阅我对 basicEntities=false 的评论,让@gabriel 的答案通过任意 HTML。 我相信他的回答直截了当,仅这一行就解决了问题,没有不必要的分心【参考方案7】:我注意到一些文本编辑操作,比如删除一个字符(通过点击 Backspace 按钮)将编辑的文本节点一分为二。在这种新创建的文本节点的末尾点击空格键总是会导致 &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 代码作为文本插入到表单中。像那样<script type="text/javascript" src="/scripts/redactor/ckeditor/ckeditor.js"></script>
此外,像<p>&nbsp;</p>
这样的空块不能在文本中指定缩进,因为字符&nbsp;
将被删除(config.fillEmptyBlocks = true;)
这是正确的解决方案
$text = preg_replace("#([^>]) #ui", "$1 ", $text);
这是一个 PHP 函数,用于替换空格上的所有字符 &nbsp;
,除了那些在标签内的字符,如 <p>&nbsp;</p>
函数代码不是最优雅的,你可以建议自己的版本。
【讨论】:
以上是关于CKEditor 不需要的字符的主要内容,如果未能解决你的问题,请参考以下文章
需要在CKEditor中的p标签中添加contentEditable = false