ホーム > カテゴリ > PHP・Laravel・CakePHP >

PHPでURLをリンクに変換する [auto_link() / url2link()]

今回はLaravelでの使い方ですが、生のPHPでも修正すれば動作可能です。

使い方

trim()で全角英数字スペースを半角に変換してtrim(PHP標準)を行います。

次にhtml()でエスケープ、半角スペース、タブ、改行コードの処理を行い、最後にURLをaタグの<a href="url">url</a>に変換してHTMLにします。

// コントローラー側
$body = "プチモンテ\r\nhttps://www.petitmonte.com/"
$body = Controller::trim($body);  
$raw_html = Controller::html($body);  

// ビュー側
{!! $raw_html !!}

ソースコード

Laravelの場合はControllerクラスの静的メソッドとして使用します。

<?php

namespace App\Http\Controllers;

use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;

class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
    
    // 全角 => 半角変換 + trim
    public static function trim($str){
        if (isset($str)){
            // a 全角英数字を半角へ
            // s 全角スペースを半角へ
            return trim(mb_convert_kana($str, 'as'));
        }else{
            return "";
        }
    }    
    
    // URLをリンクに変換する(簡易的)
    public static function auto_link($text){      
        $result = $text;
        
        if(isset($result)){
                          
            // URLパターン(予約文字 + 非予約文字 + %)
            //
            // <参考>
            // https://www.asahi-net.or.jp/~ax2s-kmtn/ref/uric.html
            // https://www.petitmonte.com/php/regular_expression_matome.html
            // 
            // 次のvalidateUrl()も参考になる ※先頭の^ と末尾の$を削除して使用する
            // laravel\framework\src\Illuminate\Validation\Concerns/ValidatesAttributes.php 
            $pattern ='/(http|https):\/\/[!#$%&\'()*+,\/:;=?@\[\]0-9A-Za-z-._~]+/';
            
            // URLをaタグに変換する
            $result = preg_replace_callback($pattern, function ($matches) {   
                        return '<a href="' . $matches[0] . '">'. $matches[0] . '</a>';
                      }, $result);
        }
        return $result;            
    }
          
    // 文字列をHTML(RAW)に変換する
    public static function html($text){       
        $result = "";
        
        if(isset($text)){
            // エスケープ
            $result = htmlspecialchars($text);            
            // 半角スペース 
            $result = str_replace(" ", '&nbsp;', $result);  
            // タブ 
            $result = str_replace("	", '&nbsp;&nbsp;', $result);  
            // 改行 
            $result = str_replace("\r\n", '<br>', $result);  
            $result = str_replace("\r",   '<br>', $result);  
            $result = str_replace("\n",   '<br>', $result);  
            // URLをaタグに変換する
            // ※既知の問題点 ---> 最初から<a href=""></a>のタグがある場合はその自動リンクが不自然となる             
            $result = Controller::auto_link($result);
        }
        return $result;
    }    
}





関連記事



公開日:2020年11月16日
記事NO:02847