【Laravel】DBに入っているテキストの表示に自動でリンク(aタグ)を入れる

えび

Laravelでテキストのリンク部分に自動で<a>タグを入れるメモ
チャットメッセージやブログ投稿表示などに用いると便利

例えば

例えば、chat_messagesテーブルのbodyカラムにテキスト文が入っていたとする

idbody
1こんにちは!
下記リンクをご確認ください。
https://zakkuri.life

これをそのまま表示すると・・

ここで、リンク部分を自動で<a>タグに置き換えてあげるとユーザービリティが高まる

モデルに文字列にリンクを埋め込む処理を行うgetアクセサを追加する

  • ChatMessageモデルにgetBodyWithLinkAttribute()メソッドを追加
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class ChatMessage extends Model
{
    use HasFactory;

    /**
     * 文字列のリンク部分に<a>タグを埋め込むよ
     *
     * @return string
     */
    public function getBodyWithLinkAttribute(): string
    {
        $pattern = '/((?:https?|ftp):\/\/[-_.!~*\'()a-zA-Z0-9;\/?:@&=+$,%#]+)/';
        $replace = '<a href="$1">$1</a>';
        return preg_replace($pattern, $replace, $this->body);
    }
}

Laravelのgetアクセサ

LaravelのモデルでgetXXXAttribute()といったメソッドを追加すると、
そこでreturnした値がModel変数で使用できるようになる

  • モデルのメソッド名はキャメルケースで記載
    (例) getFullNameAttribute()
  • 使用する場合は、get〜Attributeの間の文字列をスネークケースで記載
    (例) $model->full_name

Viewで、getアクセサで設定した値を使用する

<div>{!! nl2br($message->body_with_link) !!}</div>

いけた

文字が続いている場合でも大丈夫