【Laravel】DBにあるURLをリンク付きで表示する

PHP

画像の感じで、掲示板の書き込みの際にURLを貼り付けた時、aタグで括られたようなリンクが有効な状態で表示されるようにします。今回は改行も反映させる表示です。

投稿後の掲示板の表示↓

正規表現でURLの条件を取得する

Laravelの場合はモデルに以下のような関数を記述します。

// 掲示板の投稿のために作られたモデル:Post.php モデル名などは適宜変わる

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
    public function makeLink($value) {
        return mb_ereg_replace("(https?)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)" , '<a href="\1\2">\1\2</a>' , $value);
    }

}

フレームワークを使わない、生のphpの場合は使いたいファイルに以下を記述してください。

<?php
function makeLink($value) {
  return mb_ereg_replace("(https?)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)" , '<a href="\1\2">\1\2</a>' , $value);
}
?>
bladeファイルで呼び出す

bladeファイルで持ってきたモデルから関数を呼び出します。今回はリンクの適用と改行も反映させるようにしています。コントローラやルーティングの手順は省略します。

(不明な方はこの辺りの記事が参考になりそう -> https://laraweb.net/knowledge/733/ )

// PostController.php
<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
Use App\Models\Post;

class PostController extends Controller
{

    public function index()
    {
      $posts = Post::get();
      return view('index', compact('posts'));
    }

}


// web.php
Route::get('/','PostController@index');
// DBのデータを表示する index.blade.php
<div>
  @foreach ($posts as $post)
    <p>{!! nl2br($post->makeLink(e($post->message))) !!}</p>
  @endforeach
</div>

初めに正規表現で表示させたaタグをまず有効化させるため、 {!! ... !!} で囲みエスケープ処理を無効にします。次に nl2br() 関数によってtextareaやinputに記述された改行を投稿に反映させ(不要ならスキップ)、先ほどモデルに記述したmakeLink() 関数を呼び出します。最後にLaravelで用意された e() ヘルパを使い改めてhtmlspecialchars関数を有効にすれば完成です。

生のphpの場合↓

// $postの中にはDBから取り出した投稿の情報が入っている前提
<?php
  echo makeLink(htmlspecialchars($post['message'], ENT_QUOTES));
?>

端折りすぎた気がしますので、不明点や改善点あればコメントお待ちしています(このブログの更新が続いている限りは返信できそうです)。

タイトルとURLをコピーしました