【问题标题】:Strip consecutive line breaks from contenteditable从 contenteditable 中去除连续的换行符
【发布时间】:2017-07-23 20:45:37
【问题描述】:

在我的表单中,我将 contenteditable div 的内容复制到一个隐藏字段中,该字段将发送到数据库。

<%= form_for(@comment, remote: true) do |f| %>
    <%= f.hidden_field :content, class: 'js-NewCommentContentShadow' %>
    <div class="js-NewCommentContentField" contenteditable="true"></div>
<% end %>

我正在像这样在视图中呈现该数据

<div><%=raw comment.content %></div>

问题是,按回车键输出这个换行符

<div>
    <br>
</div>

您可以连续添加多个换行符,这很好。但在某些时候,我想去掉所有连续的换行符,所以在文本之前或之后只允许一个换行符。

这可能发生在 contenteditable 内容被复制到影子输入时,或者当表单被提交时,或者以某种方式在视图中......我不挑剔。

以下是我希望如何影响输出的一些示例:

这个:

Some text
<div>
  <br>
</div>
Some more text

很好,应该保持原样。

这个:

Some text
<div>
  <br>
</div>
<div>
  <br>
</div>
Some more text

应该改为

Some text
<div>
  <br>
</div>
Some more text

这个:

Some text
<div>
  <br>
</div>
<div>
  <br>
</div>
<div>
  <br>
</div>

应该改为:

Some text

【问题讨论】:

  • 您是否尝试过使用gsub?例如:comment.content.gsub("&lt;br&gt;", "").
  • 这是删除所有换行符。当按下返回键时,我想要换行符。但我只想允许一个连续的换行符。
  • 我试过comment.content.gsub("&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;", "&lt;div&gt;&lt;br&gt;&lt;/div&gt;"),但它不起作用。无论如何它都行不通,因为我需要考虑无限数量的这些字符串。 gsub 可以吗?
  • comment.content的具体内容是什么?
  • 我不知道,这是用户生成的评论。它可以由文本和任意数量的&lt;div&gt;&lt;br&gt;&lt;/div&gt; 实例组成。

标签: javascript jquery ruby-on-rails


【解决方案1】:

主要问题是comment.content 中的字符串包含不可打印的字符(特别是unicode 零宽度连接符 字符),因此字符串&lt;div&gt;&lt;br&gt;&lt;/div&gt; 并不总是匹配,因为不可见个字符。

要解决这个问题,您首先需要从字符串中删除这些字符,然后删除额外出现的 &lt;div&gt;&lt;br&gt;&lt;/div&gt;

一种方法是使用gsub\p{Cf} regex1 并再次使用gsub 来替换额外的&lt;div&gt;&lt;br&gt;&lt;/div&gt;,如下所示:

comment.content.gsub(/\p{Cf}/, "").gsub(/(<div><br><\/div>)+/, "<div><br></div>")
#=> "Some text<div>Some more text</div><div><br></div>. Here is another Some text<div><br></div><div>Some text</div>"

要完全删除字符串末尾出现的所有 &lt;div&gt;&lt;br&gt;&lt;/div&gt;(示例 3),您可以添加另一个 gsub,从字符串末尾删除该子字符串,例如:

comment.content.gsub(/\p{Cf}/, "")
       .gsub(/(<div><br><\/div>)+/, "<div><br></div>")
       .gsub(/(<div><br><\/div>)+$/, "")

正则表达式中添加的$ 代表字符串结尾


1\p{Cf} 代表“其他:格式”inUnicode 字符的一般类别。 更多信息请参考Regexp class documentation

【讨论】:

  • 感谢 Gerry,非常有帮助!您提供的代码修复了大多数问题,但它用单个换行符替换了连续换行符,我想用任何内容替换连续换行符。
  • 只需将gsub(/(&lt;div&gt;&lt;br&gt;&lt;\/div&gt;)+/, "&lt;div&gt;&lt;br&gt;&lt;/div&gt;") 更改为gsub(/(&lt;div&gt;&lt;br&gt;&lt;\/div&gt;)+/, "")
  • 我试过了,但这只是删除了所有换行符。我想留下单数换行符,但是当它们后面没有任何内容时,或者当它们后面跟着另一个换行符时,删除所有换行符。当它们后面跟着文字时,我想保留它们。不过谢谢,如果我玩一段时间,我可能会找到答案。
  • @colmtuite 嗯,您可以为您提供的示例字符串提供所需的输出吗?
  • 是的,这解决了所有问题。非常感谢您的帮助,非常感谢!
【解决方案2】:

你可以这样做:

"<div><br><br></div><br><br><br><div><br></div><br>".gsub(/(<br>){2,}/, '<br>')

输出

=> "<div><br></div><br><div><br></div><br>"

基本上,匹配()&lt;br&gt; 组中的任意 2 次或多次出现 - {2,},并替换 &lt;br&gt;。所以选择&lt;br&gt; 出现重复(不止一次)的所有位置并替换单个&lt;br&gt;。 在您的实际情况下,您可能需要为white spaceline breaks 等添加容差。

【讨论】:

  • 你的意思是&lt;%=raw comment.content.gsub(/(&lt;br&gt;){2,}/, '&lt;br&gt;') %&gt;?我已经尝试过了,但它没有任何效果。我不明白为什么你的代码中有=&gt;,或者我应该把它放在哪里?
  • 这里有两件事,有正则表达式部分,由/ /包围,这可以在不同的地方使用,你可以在JS中作为你的用户类型来做,wtv。剩下的是红宝石,gsub(/pattern/, 'substitution')。要使用gsub,您必须在渲染时或提交表单后使用它。就像我说的那样,您可能必须包括换行符和空格,wtv。您需要查看您的 raw 实际输出的内容并进行调整。
  • 我试过&lt;%=raw comment.content.gsub(/(&lt;br&gt;){2,}/, '&lt;br&gt;') %&gt;,它似乎对输出的影响为零。我使用不正确吗?还是我需要调整语法?
  • 您需要查看comment.content 的输出是什么,这是一个无法正常工作的真实示例,以便您可以解释模式差异
  • 我一直在尝试各种组合,但现在的问题是,我正在尝试您建议的代码,但它对输出没有任何影响。这是我要删除的确切字符串&lt;div&gt;&lt;br&gt;&lt;/div&gt;。当该字符串连续出现不止一次时,我想用“”替换它。你能告诉我如何实现吗?
猜你喜欢
  • 1970-01-01
  • 2010-11-30
  • 2023-02-08
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
  • 2012-09-13
  • 2015-12-13
  • 1970-01-01
相关资源
最近更新 更多