アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下の様な文字列を

<div>xxx</div>yy<span>zzz</span>

以下の様に編集したいです。

<div>xxx</div>
yy
<span>zzz</span>

htmlのタグ毎に改行を挿入したいのです。
もしも上記例でyyがなければ以下の様に書くのですが、
require 'drb/drb'
puts DATA.read.scan(/(<.+?>.+?<\/.+?>)/).join("\n")
__END__
<div>xxx</div>yy<span>zzz</span>

以上、よろしくご指導の程、お願い申し上げます。

A 回答 (2件)

最近マニュアルを見ていたら、splitでこのようなことができる事に気づきました。



こんなのはどうですか。
puts DATA.read.chomp.split(/(<.+?>.+?<\/.+?>)/).reject{|a| a==""}.join("\n")
もう少し縮めて
puts DATA.read.chomp.split(/(<.+?>.+?<\/.+?>)/).reject{|a| a==""}
もできるみたいです。

もうひとつおまけですが、\を使うのがいやな場合は
puts DATA.read.chomp.split(%r[(<.+?>.+?</.+?>)]).reject{|a| a==""}
のような書き方も
    • good
    • 0
この回答へのお礼

ki073さん、ご回答有り難うございました。 とても参考になりました。

お礼日時:2013/07/11 11:36

scan部分を


split(/(<.+?>.+?<\/.+?>)/)
にします。()で囲むのがミソです。

この回答への補足

ki073さん、ご回答有り難うございます。

なるほど!! 素晴らしい!! 頭イイ!!

しかし、一行目と最終行に空行が入っちゃいますね。
最終行はchompを加えれば消えますが一行目を消そうと思い、以下の様に書いてみました。

puts DATA.read.chomp.split(/(<.+?>.+?<\/.+?>)/).inject([]){|array,i|
array<<i if i!='';
array
}.join("\n")

なんか、仰々しくなってしまいました。。。 もう少しスマートな方法とかないでしょうか??
ライブラリを使った解でもかまいません。

補足日時:2013/07/10 10:27
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!