1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Ruby on Rails】後方参照を使ったgsubメソッドでの文字列書き換え

Posted at

Ruby on Railsで2chビューワの製作中に、gsubメソッドと正規表現を使って文字列置換をしていた時にハマったので書いておきます。

どうしたいか

ddタグ(レスポンス本文)内の>>idへのリンク先はそのままで、>>id-idへのリンクから-idの部分を除去して>>idにしたい。(処理を統一したい)

どうしたか

text = "<dd> <a href=\"../test/read.cgi/moeplus/1506116566/187\" rel=\"noopener noreferrer\" target=\"_blank\">&gt;&gt;187</a>
 <br>\x{96EC}\x{8FE3}\x{8349}\x{835E}\x{8AEE}\x{926E}\x{8A4F}\x{90BA}\x{93D8}\x{834A}\x{8347}\x{838C}
<br> \x{82BB}\x{82B5}\x{82C4}\x{82CD}\x{82E6}\x{8E80}\x{82CB} <br><br>\n</dd>\n"

text = text.gsub(/<a href(\w|\d|=|>|<|"|\.|\/|_|\\|\s|-)+&gt;&gt;(\d+|\d+-\d+)<\/a>/) {
        link_id = $2
        link = (link_id.match(/-/) == nil ? link_id : link_id.gsub(/-\d+/, ''))
        "<a href=##{link}>&gt;&gt;#{link_id}</a>"
      }

始めに、gsubメソッドでaタグ部分を端から端までマッチさせます。
次にブロックを作って、中に書き換えする文字列を書きます。
今回は書き換えの前に、後方参照した文字列$2から-idを除去しています。

$2のままだと、Stringのメソッドが使えないので、link_id$2を代入します。
link_id内に-がない場合はそのままで、ある場合は-idを除去します。
最後に、aタグにそれぞれの変数を埋め込んで書き換えています。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?