Skip to content Skip to sidebar Skip to footer

Strip Consecutive Line Breaks From Contenteditable

In my form, I'm copying the content of a contenteditable div into a hidden field, which gets sent to the db. <%= form_for(@comment, remote: true) do |f| %><%= f.hidde

Solution 1:

The main problem is that the string in comment.content contains non-printable characters (specifically unicode zero width joiner characters), so the string <div><br></div> is not always a match because of this invisible characters.

To get around this you first need to remove those characters from the string and then remove the extra <div><br></div> occurrences.

One way to do it is using gsub along with \p{Cf} regex and the use gsub again to replace the extra <div><br></div>, like this:

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

To completely remove all <div><br></div> occurrences at the end of the string (example 3), you could add another gsub that removes that substring from the end of the string, for example:

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

The added $ in the regexp stand for end of string.


Solution 2:

You can do:

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

outputs

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

basically, match any 2 or more occurrences - {2,} - of group (), <br>, and substitute for <br>. So pick all where <br> appears repeated (more than once) and substitute for a single <br>. In your actual case you might need to add tolerance to white space, line breaks, etc.

Post a Comment for "Strip Consecutive Line Breaks From Contenteditable"