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

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

ただいまの
回答率

88.11%

ASP.NET MVC 5でテキスト内のURLをaタグに書き換えたい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,353

score 201

Visuak Studio2017
ASP.NET MVC5
C# 6.0

例えば以下のように
string contents = "このサイトに飛んでください https://teratail.com/ ";
URLが書いてあるテキストがあるとして、これをWebページ上にテキストを表示するときにときに自動でテキスト内のURLをaタグに書き換えてたいのですが、
いまいち調べても方法が分かりませんでした。

public ActionResult Details(int? id)
  {
    string contents;
    var boards = DB.t_Boards.Find(id);
    contents = boards.Contents.Replace(Environment.NewLine, "<br />");
    model = new DetailViewModel
    {
     Contents = contents
    }
    return View(model);
  }


のように変数contentsに当該するテキストが入っている場合
この変数boardsに対してどう処理を行い、viewに値を渡せばよいのでしょうか?
初歩的な質問かもしれませんが上手く解決できず迷っております。
よろしくお願い致します。

 追記

ご返信ありがとうございます。
大変申し訳ございません。
そもそも当該するようなページが出てこず、コーディングして試すことが出来ていないという状態です。
https://www.ipentec.com/document/csharp-asp-net-using-hyperlink-control
であったりwebFormの記事は出てくるのですがMVC5での記事が出てきていないという状態で、そもそもの方法を掴めていない状態です。
どのようなアプローチをとればよいかお教え頂くと幸いです。

viewのコード、マークアップ

@model Db.Models.DetailViewModel

   @{
     if (Model.Contents != null)
     {
       <td class=" col-md-10 col-lg-10"> @Html.Raw(Model.Contents) </td>
     }
     else if (Model.Contents== null)
     {
     <td class="">未記入 </td>
      }
    }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • widget11

    2019/04/17 14:59

    編集致しました。

    キャンセル

  • m.ts10806

    2019/04/17 15:02

    確認ですがその「変数contents」についてはビューに渡されてるんですよね?

    キャンセル

  • widget11

    2019/04/17 15:15

    ご返信ありがとうございます。
    そうです。一応編集して追記しましたが、一度DetailViewModelというviewmodelに突っ込んでviewにmodelごと渡しています。

    キャンセル

回答 2

checkベストアンサー

+1

正規表現による文字列の置換処理になります。

string contents = "あああああああhttps://www.google.co.jp/いいいいいいいいい";
System.Console.WriteLine("置換前");
System.Console.WriteLine(contents);
contents =  System.Text.RegularExpressions.Regex.Replace(
contents,
@"s?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+",
"<a href=\"$&\">$&</a>");
System.Console.WriteLine("置換後");
System.Console.WriteLine(contents);

/**
置換前
あああああああhttps://www.google.co.jp/いいいいいいいいい
置換後
あああああああ<a href="https://www.google.co.jp/">https://www.google.co.jp/</a>いいいいいいいいい
**/

contentsという変数をビューに渡せているのでしたら置換したものを同名変数に上書きすればそのままいけると思います。
※ビュー側で置換が書けるかどうかは手元のすぐ動かせる環境がないのでわかりません。
paiza.ioで確認しました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/17 16:21

    ご回答ありがとうございます!
    無事正規表現で置換することができました!

    キャンセル

  • 2019/04/17 16:26

    課題は調べ方、の方ですね。
    キーワードを工夫してみると良いです。
    解決されたようで何よりです

    キャンセル

+1

例えば以下のように
string contents = "このサイトに飛んでください https://teratail.com/ ";
URLが書いてあるテキストがあるとして、これをWebページ上にテキストを表示するときにときに自動でテキ> スト内のURLをaタグに書き換え

ブラウザに送信される時に以下のように html に変換されればいいのですか?

<a href="https://teratail.com/">このサイトに飛んでください</a>

であれば、文字列の操作はなるべくコントローラーで行うようにするのか良さそうなので、当該アクションメソッドで contents をリンクテキスト(このサイトに飛んでください)と URL(https://teratail.com/)に分け、それらを ViewBag に格納してビューに渡し、html の a タグを組み立てるようにしてはいかがですか?

テンプレートで自動生成される Home/Contact に具体例を追記すると以下のようになります。

アクションメソッド

public ActionResult Contact()
{
    ViewBag.Message = "Your contact page.";

    ViewBag.LinkText = "このサイトに飛んでください";
    ViewBag.Url = "https://teratail.com";

    return View();
}

ビュー

@{
    ViewBag.Title = "Contact";
}
<h2>@ViewBag.Title.</h2>
<h3>@ViewBag.Message</h3>

<address>
    One Microsoft Way<br />
    Redmond, WA 98052-6399<br />
    <abbr title="Phone">P:</abbr>
    425.555.0100
</address>

<address>
    <strong>Support:</strong>   <a href="mailto:Support@example.com">Support@example.com</a><br />
    <strong>Marketing:</strong> <a href="mailto:Marketing@example.com">Marketing@example.com</a><br />
    <strong>テラテイル:</strong> <a href="@ViewBag.Url">@ViewBag.LinkText</a>
</address>

実行結果

イメージ説明

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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