2017-05-24 5 views
0

私のクライアントのデータには、Reactネイティブ用のRails APIで '\ n \ n'と置き換える必要があるタグがあります(<br>)アプリ。APIのためのRuby-gsub brタグをすべての空白を含めて

時々、<br>タグの前後にスペースがあるか、またはその両方があります。

私は「どんな<br>タグを言う、そしてまた前または後に空白が含まれる、と交換してください 『\ nは\ n』のためにgsubを探しています

は、今私がやっている:。

module ApiHelper 
    def parse_newlines(string) 
    string = string.gsub('<br>', '\n\n') 
    string = string.gsub(' <br>', '\n\n') 
    string = string.gsub('<br> ', '\n\n') 
    string = string.gsub(' <br> ', '\n\n') 
    end 
end 

はきれいなものはあります

EDIT:?ありがとう、すべての私は彼が私にダウンして汚れた溶液を得たので、両方のギャビンさんとブリキ男の答え...ギャビンを受け入れるようにしたいが、そのようなAのブリキ男。より堅牢な方法での偉大な/深い説明usiノコギリ...

第2編集:私はそれを取ります。錫の男... Nokogiriを使うことは、実際にははるかに読みやすくなります。あなたのコメントにregexを使用するあなたの議論は有効です。最終的には、コードを理解しやすくなります。 Gavin'sを使っていますが、答えが得られました。

+0

「[mcve]」をお読みください。問題を示す必要な入力(最小限のHTML)とともに、作業中の最小限のコード例を提供します。 HTMLを作成するように私たちに依頼することは、時間を無駄にし、あなたと他の人を助けるときに私たちを遅らせる。 「< br>」、「
」、「
」、またはそれ以上になる可能性があります。 HTMLを変更するために正規表現や文字列操作を使わないでください。それはあなたにナッツを渡すでしょう。代わりにパーサーを使用します。 –

答えて

1

HTMLやXMLを使いこなす場合は、パーサーを使用する方がよいでしょう。私は開始したい:あなたは<pre>タグでそれをラップしない限り、宇宙の実行、または複数のリターンが単一のスペースまたは単一の行に削減されますので、ブラウザで表示されるHTMLで

require 'nokogiri' 

doc = Nokogiri::HTML::DocumentFragment.parse(<<EOT) 
<p>this<br>is<br> some <br> 
text<br>and<br >some<br/>more</p> 
EOT 

doc.search('br').each { |br| br.replace("\n\n") } 
doc.to_html 
# => "<p>this\n" + 
# "\n" + 
# "is\n" + 
# "\n" + 
# " some \n" + 
# "\n" + 
# "\n" + 
# "text\n" + 
# "\n" + 
# "and\n" + 
# "\n" + 
# "some\n" + 
# "\n" + 
# "more</p>\n" 

空白がブラウザによって丸飲みされますまたは類似の何かをする。

あなたは絶対にあなたは改行を挿入している場所の前後にスペースを削除する必要がある場合は、私が余分なステップを使用したい:

require 'nokogiri' 

doc = Nokogiri::HTML::DocumentFragment.parse(<<EOT) 
<p>this<br>is<br> some <br> 
text<br>and<br >some<br/>more</p> 
EOT 

doc.search('p').each do |p| 
    p.inner_html = p.inner_html.gsub(/ +</, '<').gsub(/> +/, '>') 
end 

doc.to_html 
# => "<p>this<br>is<br>some<br>\n" + 
# "text<br>and<br>some<br>more</p>\n" 

doc.search('br').each { |br| br.replace("\n\n") } 
doc.to_html 
# => "<p>this\n" + 
# "\n" + 
# "is\n" + 
# "\n" + 
# "some\n" + 
# "\n" + 
# "\n" + 
# "text\n" + 
# "\n" + 
# "and\n" + 
# "\n" + 
# "some\n" + 
# "\n" + 
# "more</p>\n" 

注:技術的には、<br>「は、単一のと同等です\ n "ではなく、" \ n \ n "ではありません。 <p>は段落を構成するので2行の改行になります。

+0

これらの詳細すべてに感謝します!ええ、私は1つではなく2つの行が必要だと気付きました。データはクライアントからのワード/エクセルから来たもので、これらのシンボルは最初は
というタグで誤って置き換えられました。その後、私は
タグをネイティブで反応させることができなかったことに気づき、/ nを使用する必要がありました。それから、実際には2つの/ – gregblass

+0

ノコギリはかなり素晴らしいようです。私は後でもっと堅牢な構文解析をしなければならないかもしれませんが、これは参考になります。とても有難い! – gregblass

2

これはやる:

module ApiHelper 
    def parse_newlines(string) 
    # Handles <br>, <br/>, <br /> 
    string.gsub(/\s*<br\s*?\/?>\s*/, "\n\n") 
    end 
end 

# irb 
> parse_newlines("  <br>  ") 
=> "\n\n" 
> parse_newlines("  <br />  ") 
=> "\n\n" 
> parse_newlines("<br />") 
=> "\n\n" 
1

あなたがして試すことができます:

string = 'Lorem <br> Ipsum' 
puts string.gsub(/\s(<br>)\s/, '\n\n') 
# => Lorem\n\nIpsum 
puts string.gsub(/\s(<br>)\s/, "\n\n") 
# Lorem 
# 
# Ipsum 

そして'\n\n'"\n\n"との違いに注意してください。

1
module ApiHelper 
    def parse_newlines(string) 
    string.gsub(/\s*<br>\s*/, "\n\n") 
    end 
end 
+0

正規表現を扱うときはhttp://rubular.com/をチェックしてください;) –

関連する問題