質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

6171閲覧

railsのgsubでの文字列置換について

GOROGORO

総合スコア66

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2015/03/25 12:06

railsでの文字列置換について質問させてください。

gsubを使って改行コードを<br>タグに変換しています。

lang

1text = text.gsub(/\r\n|\r|\n/, "<br />").html_safe

しかし、特定のタグ(<pre>タグ)内の改行コードは変換させたくありません。
以下のようにして1.で一度変換したtextを再度置換させることで対応させようと考えました

lang

1text = text.gsub(/(<pre.*)<br \/>(.*pre>)/m, "\\1\n\\2").html_safe

しかし、<pre>タグ内に複数回<br>タグが出てくると最後の一回の<br>タグしか変換されません。

<pre>タグ内の<br>タグをすべて改行コードに変換したいのですが、いい方法ないでしょうか? よろしくお願いします!!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんな方法は如何でしょうか?

lang

1# <pre> や </pre> で 文字列を分割します。 2# <pre> </pre> のなかの文字はなにも変換しない。 3# <pre> </pre> の外も文字は 改行コードを <br> に置換する。 4 5def my_breakline(text) 6 # ps = text.split(/(<pre>)|(<\/pre>)/) 7 # p ps 8 ans = '' 9 in_pre = false 10 text.split(/(<pre>)|(<\/pre>)/).each do |st| 11 12 if st == '<pre>' 13 in_pre = true 14 ans << st 15 next 16 elsif st == '</pre>' 17 in_pre = false 18 ans << st 19 next 20 end 21 22 ans << ((in_pre == true)? st : st.gsub(/\r\n|\r|\n/, '<br/>')) 23 end 24 ans 25end 26 27text = "A\nB<pre>1\n23</pre>C\nD<pre>4\n56</pre>E\nF" 28p text 29p my_breakline(text)

これを run すると、次の出力が得られます。

$ ruby my_breakline.rb "A\nB<pre>1\n23</pre>C\nD<pre>4\n56</pre>E\nF" "A<br/>B<pre>1\n23</pre>C<br/>D<pre>4\n56</pre>E<br/>F"

投稿2015/03/25 16:36

編集2015/03/26 11:01
katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GOROGORO

2015/03/25 22:15

ありがとうございます‼ お教えいただいた通りにしたら、問題なく置換されました!!
riocampos

2015/03/26 05:43

`String#split` で丸括弧でグルーピングしてると結果の配列に含まれるんですね。知らなかったです。ありがとうございます。 正規表現部分は `text.split(%r[(</?pre>)])` とも書けますね(冒頭の変数psがかわいそうだと思ってしまいました)。
katoy

2015/03/26 10:59

かわいそうな ps はコメントアウトしておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問