###概要
テキスト中にあるURLを自動でリンクに置換することでフロント側でリンク化する手間が省けるのでバックエンドで処理をしてみました。
###URLをリンク化する
今回はテキスト中にURLの行のみがある場合にリンク化させます。文章中のURLは、リンク化しない正規表現にしました。
https://sample.co.jp //リンク化
https://test テスト //無視
###$textのURLをリンク化
public static function replaceUrl($text)
{
$texts = explode(PHP_EOL, $text); //PHP_EOLは,改行コードをあらわす.改行があれば分割する
$pattern = '/^https?:\/\/[^\s \\\|`^"\'(){}<>\[\]]*$/'; //正規表現パターン
$replacedTexts = array(); //空の配列を用意
foreach ($texts as $value) {
$replace = preg_replace_callback($pattern, function ($matches) {
//textが1行ごとに正規表現にmatchするか確認する
if (isset($matches[1])) {
return $matches[0]; //$matches[0] がマッチした全体を表す
}
//既にリンク化してあれば置換は必要ないので、配列に代入
return '<a href="' . $matches[0] . '" target="_blank" rel="noopener">' . $matches[0] . '</a>';
}, $value);
$replacedTexts[] = $replace;
//リンク化したコードを配列に代入
}
return implode(PHP_EOL, $replacedTexts);
//配列にしたtextを文字列にする
}
####使用したメソッド
explode — 文字列を文字列により分割する
(https://www.php.net/manual/ja/function.explode.php)
preg_replace_callback — 正規表現検索を行い、コールバック関数を使用して置換を行う
(https://www.php.net/manual/ja/function.preg-replace-callback.php)
implode — 配列要素を文字列により連結する
(https://www.php.net/manual/ja/function.implode.php)
###使っている正規表現について
$pattern = '/^https?:\/\/[^\s \\\|`^"\'(){}<>\[\]]*$/'
^
先頭にhttpsまたはhttpにマッチする
\
直後の正規表現記号を エスケープ
[^...]
角括弧に含まれる文字以外にマッチ
ここでは、半角、全角スペースとURLで除外される記号以外とマッチさせています
*
直前の文字が 0回以上 繰り返す場合にマッチします。最長一致。
?
直前の文字が 0個か1個 の場合にマッチします。最長一致。
###あとがき
文字列を改行ごとに分割して、分割したものが正規表現にマッチした場合URLをリンク化し、
それをまた文字列に変換したりとするなど色々考えたので勉強になりました。
正規表現もURLとマッチするものを考える作業が楽しかったです。
###参考記事
(https://qiita.com/sukobuto/items/b6cdfa966b29823c62f0)