从连心中删除连续的换行符

时间:2017-07-23 20:45:38

标签: javascript jquery ruby-on-rails

在我的表单中,我将可疑的import re def convert(text): x=re.match(r'([a-zA-Z]+) --> ([a-zA-Z]+) ([a-zA-Z]+)',text) if x: return (x.group(1),[x.group(2),x.group(3)]) else: return False convert("S --> NP VP") 内容复制到隐藏字段中,然后将其发送到数据库。

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>

很好,应保持不变。

此:

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>

2 个答案:

答案 0 :(得分:1)

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

要解决此问题,首先需要从字符串中删除这些字符,然后删除额外的<div><br></div>次出现。

一种方法是使用gsub\p{Cf} regex 1 并再次使用gsub替换额外的<div><br></div>,像这样:

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>"

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

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

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

1 \p{Cf}代表&#39;其他:格式&#39; in Unicode字符的常规类别。 有关详细信息,请参阅Regexp class documentation

答案 1 :(得分:-1)

你可以这样做:

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

输出

{2,}

基本上,匹配任意两次或多次 - () - 群组<br><br>,并替换<br>。因此,选择<br>重复出现的所有地方(不止一次)并替换单个white space。 在您的实际情况中,您可能需要为line breaksTestContext等添加容差