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\">>>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|-)+>>(\d+|\d+-\d+)<\/a>/) {
link_id = $2
link = (link_id.match(/-/) == nil ? link_id : link_id.gsub(/-\d+/, ''))
"<a href=##{link}>>>#{link_id}</a>"
}
始めに、gsubメソッドでaタグ部分を端から端までマッチさせます。
次にブロックを作って、中に書き換えする文字列を書きます。
今回は書き換えの前に、後方参照した文字列$2
から-id
を除去しています。
$2
のままだと、Stringのメソッドが使えないので、link_id
に$2
を代入します。
link_id
内に-
がない場合はそのままで、ある場合は-id
を除去します。
最後に、aタグにそれぞれの変数を埋め込んで書き換えています。