これ難しいですよね。
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:24
2020/04/28 08:39
2020/04/28 08:52
2020/04/28 08:54
2020/04/28 08:58
2020/04/28 09:02
2020/04/28 09:05
2020/04/28 09:06
2020/04/28 09:08
2020/04/28 09:28