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

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

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

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

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

ハイパーリンク

ハイパーリンクとは、ハイパーテキストにおいて、複数の文書を結び付ける役割を担う「参照」である。単にリンクとも呼びます

受付中

Rubyで掲示板の書き込みの中でハイパーリンクを作りたい

rubyrubyrubyrub
rubyrubyrubyrub

総合スコア0

Ruby

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

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

ハイパーリンク

ハイパーリンクとは、ハイパーテキストにおいて、複数の文書を結び付ける役割を担う「参照」である。単にリンクとも呼びます

1回答

0評価

0クリップ

996閲覧

投稿2021/01/17 13:09

前提・実現したいこと

Rubyで掲示板を作っています。

掲示板にコメントする際に、URLを含んでいる場合、そのURLをハイパーリンクにしたいです。
どのようにコードを書けばいいでしょうか?

どこを調べてもRailsでの実装しか出てきません。Rubyでの実装がしたいです。

bbs.logファイルは下のrubyファイルと同じところに作ってる状態です。

Ruby

# coding: utf-8 require "socket" require "uri" require "cgi/util" require "pathname" LOG = "bbs.log" ss = TCPServer.open(8160) loop do Thread.start(ss.accept) do |s| begin path, params = s.gets.split[1].split("?") header = "" body = "" myname = "名無し" value = "" color = "" size = "" if (params != nil) params.split("&").each do |param| pair = param.split("=") pname = pair[0] pvalue = URI.decode(pair[1] == nil ? "" : pair[1]) myname = pvalue if (pname == "myname") value = pvalue if (pname == "value") color = pvalue if (pname == "color") size = pvalue if (pname == "size") end end if (path == "/") status = "200 OK" header = "Content-Type: text/html; charset=utf-8" log = [] message = "" if value != "" value=value.gsub(/(\r\n|\r|\n)/, "<br />") log.unshift("<b>#{myname}</b> : (<I>#{Time.new}</I>)<br><font color=" + color + " size=" + size +">" + value + "</font></p><br>\n") f = open(LOG, "a") log.each{ |line| f.print line } f.close end f = open(LOG) f.each{|line| message = line + message } f.close def text_url_to_link message URI.extract(message, ['http']).uniq.each do |url| sub_text = "" sub_text << "<a href=" << url << " target=\"_blank\">" << url << "</a>" text.gsub!(url, sub_text) end return message end body = "<html><body>こんにちは<br>" body += "<form method=get>" body += "name:<input type=text name=myname value=名無し>" body += "<select name=color>\n" body += "<option value=black" body +=" selected" if (color=="black") body += ">黒</option>\n" body += "<option value=red" body +=" selected" if (color=="red") body += ">赤</option>\n" body += "<option value=blue" body +=" selected" if (color=="blue") body += ">青</option>\n" body += "<option value=green" body +=" selected" if (color=="green") body += ">緑</option>\n" body += "<option value=yellow" body +=" selected" if (color=="yellow") body += ">黄</option>\n" body += "</select>\n" body += "<select name=size>\n" body += "<option value=1" body +=" selected" if (size=="1") body += ">1</option>\n" body += "<option value=2" body +=" selected" if (size=="2") body += ">2</option>\n" body += "<option value=3" body +=" selected" if (size=="3") body += ">3</option>\n" body += "<option value=4" body +=" selected" if (size=="4") body += ">4</option>\n" body += "<option value=5" body +=" selected" if (size=="5") body += ">5</option>\n" body += "</select><br>\n" body += "comment:<textarea name=value cols=40 rows=3></textarea>" body += "<input type=submit value=書き込み>" body += "</form><hr>" body = body+message body = body + "</body></html>" else status = "302 Moved" header = "Location: /" end s.write("HTTP/1.0 " + status + "\r\n") s.write(header + "\r\n") if (header != "") s.write("\r\n") s.write(body) puts Time.new.to_s + " " + status + " " + path s.close end end end

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

m.ts10806

2021/01/17 21:17

>Railsでの実装しか出てきません Railsは結局Rubyで組まれてるので、ほぼ同じ考え方ができるのでは? 結局のところ正規表現による置換になると思いますし、 「Railsのやり方」がでてくるのでしたら、対応している機能など追っていくことで考え方を学ぶこともできるはずです。
rubyrubyrubyrub

2021/01/18 06:45

require "uri" def text_url_to_link text URI.extract(text, ['http']).uniq.each do |url| sub_text = "" sub_text << "<a href=" << url << " target=\"_blank\">" << url << "</a>" text.gsub!(url, sub_text) end return text end Railsのやり方はこれらしいのですが、これをRubyの正規表現で上のコードに入れることはできますでしょうか? Railsのこのコードの場合、textの中に代入された文の中からhttpで始まる部分を抽出していると思いますが、上のコードだと掲示板でコメントした際にどこにそのコメントが代入されているのかがわかりません。
m.ts10806

2021/01/18 07:33

URIモジュールはRuby由来のものっぽいですが(リファレンスマニュアルにも載ってる)、それは使えないということですか?
rubyrubyrubyrub

2021/01/18 07:42

いえ、URIモジュールは使えるので、このtext_url_to_linkをうまく上のコードに実装できていないだけだと思います。ここの実装がうまくいかなくて困っているところです。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Ruby

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

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

ハイパーリンク

ハイパーリンクとは、ハイパーテキストにおいて、複数の文書を結び付ける役割を担う「参照」である。単にリンクとも呼びます