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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Vuex

Vuexは、Vue.js アプリケーションのための状態管理ライブラリです。アプリケーション内で使用するコンポーネントのための集中データストアを提供。コンポーネント同士でデータをやり取りし、処理のフローを一貫させたり、データの見通しを良くすることができます。

Q&A

解決済

1回答

4952閲覧

Vue テキストの中身のURL 遷移させたい

cuku

総合スコア108

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Vuex

Vuexは、Vue.js アプリケーションのための状態管理ライブラリです。アプリケーション内で使用するコンポーネントのための集中データストアを提供。コンポーネント同士でデータをやり取りし、処理のフローを一貫させたり、データの見通しを良くすることができます。

1グッド

1クリップ

投稿2020/04/28 05:39

編集2020/04/28 08:54

やりたいこと
Vue.jsを使っています
テキストの中身にURLが入っていそれをクリックしたらそのULRまで遷移できるようにしたいです。
textの中身は以下のようにURLと文字列が混ざっています

// textの中身 このサイト面白いよーーー https:// ufdgwufkdgksfdkshkjd
<template> <p class="relation"> {{ text }} </p> </template>

//追記

<template> <p class="label">{{ text }}</p> </template> <script lang="ts"> import { Component, Vue, Prop } from 'vue-property-decorator' @Component({ export default class Text extends Vue { @Prop({ type: String, required: true }) text: string } GetUrlInText() { const matches = this.text.match(/https?://\S+/gi) if(matches != null) { return matches } else { return [] } }
kakedashidesu👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

これ難しいですよね。
Vueのテンプレートだと普通はできなくて、 v-html を使った場合は XSS になりえるので、サニタイズなりしないといけなくなってきます。

あまり簡潔には書けないのですが、VueでもJSXを使えるのでJSXを使う方法があります。
VueでJSXを使ってテキスト中のURLをaタグにする - Qiita

上記記事などを参考に、私は以前以下のように書いていました。

UrlToLink.vue

vue

1<script> 2import * as urlRegex from "urlregex"; 3 4export default { 5 methods: { 6 parseSlot() { 7 if ( 8 !this.$slots || 9 !this.$slots.default || 10 !this.$slots.default[0] || 11 !this.$slots.default[0].text 12 ) { 13 return []; 14 } 15 let processText = this.$slots.default[0].text; 16 const matchedURL = processText.match(urlRegex({ exact: false })); 17 if (matchedURL) { 18 const set = new Set(matchedURL); 19 set.forEach(url => { 20 processText = processText.split(url).join(`\t\v${url}\v\t`); 21 }); 22 } 23 return processText.split("\t"); 24 } 25 }, 26 render(h) { 27 return ( 28 <div> 29 {this.parseSlot().map(text => { 30 const matched = text.match(/^\v(.+)\v$/); 31 if (matched) { 32 return ( 33 <a href={matched[1]} rel="ugc noreferrer noopener" target="_blank"> 34 {matched[1]} 35 </a> 36 ); 37 } 38 return text; 39 })} 40 </div> 41 ); 42 } 43}; 44</script>

aタグの属性などは適宜書き換えてください。
URLの正規表現はこちらのライブラリを使用しました urlregex

使う際は以下のようにします。

vue

1<template> 2 <p class="relation"> 3 <UrlToLink>{{ text }}</UrlToLink> 4 </p> 5</template> 6 7<script> 8import UrlToLink from "@/components/UrlToLink.vue"; 9 10export default { 11 components: { 12 UrlToLink 13 }, 14 // ... 15}; 16</script>

投稿2020/04/28 08:11

aaharu

総合スコア441

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cuku

2020/04/28 08:24

ありがとうございます!! なかなか手間がかかるんです!!!! 調べたところurlRegexというライブラリはあんまり使われていなさそうですね。少し検討してみます!! https://noknow.info/it/javascript/get_url_from_text_string?lang=ja 調べたところjsでURLを取得する関数があったのですがpタグにこの関数を埋め込んでURLだけ<a>タグにするとかはできませんか?
aaharu

2020/04/28 08:39

ライブラリは別に何でもいいです。 https://www.npmjs.com/package/url-regex これでもいいですが(urlRegexのもとはこれです)、これだとIE11で動かすためには工夫がいります。 ライブラリも結局正規表現あててるだけなので、その関数の正規表現を使いたいのであればそのように書けばできるのではないでしょうか。
cuku

2020/04/28 08:52

ありがとうございます。 そのようにとはどう書けばいいのでしょうか?
cuku

2020/04/28 08:54

追記しました
aaharu

2020/04/28 08:58

processText.match(urlRegex({ exact: false })); を processText.match(/https?://\S+/ig); にするとか。 関数を埋め込んで~ってのはよくわかんなかったので考えてません。
cuku

2020/04/28 09:02

埋め込むという言葉が悪かっったです。すいません。 GetUrlInText() { const matches = this.text.match(/https?://\S+/gi) if(matches != null) { return matches } else { return [] } 上記の関数を使いたいのですがどうやったら使えるのでしょうか?
aaharu

2020/04/28 09:05

その関数をどうしても使いたいなら text の文字列を書き換えて、表示する際は v-html を使うしかないのかなと思います。
cuku

2020/04/28 09:06

すいません。理解しました!! ありがとうございます
cuku

2020/04/28 09:08

parseSlot() { if ( !this.$slots || !this.$slots.default || !this.$slots.default[0] || !this.$slots.default[0].text ) { return [] } の処理は何をしている処理なのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問