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(" ", ' ', $result); // タブ $result = str_replace(" ", ' ', $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