前提
フォームから入力した文字列から、正規表現でURLを抽出しリンク化させたいのですが、日本語を含んだURLでも抽出しようとするとうまくいかず、つまずいていますのでご教授いただけますと幸いです!
実現したいこと
以下のパターン①〜④のようにURLだけを抽出しリンク化させたい
# パターン①(url(https)の前に文字列がある) $text = testhttps://teratail.com/ # 想定している出力結果 test <a href="https://teratail.com/" target="_blank" rel="noopener"> <span style="border-bottom: solid 1px">https://teratail.com</span> </a> # パターン②(URLの後に改行、空白(半角、全角)がある場合) $text = https://teratail.com/\ntest $text2 = https://teratail.com/ test $text3 = https://teratail.com/ test # 想定している出力結果 <a href="https://teratail.com/" target="_blank" rel="noopener"> <span style="border-bottom: solid 1px">https://teratail.com</span> </a><br>test test test # パターン③(URLの中に全角文字列がある場合(空白は除く)) $text = https://テラテイル.com/テラテイル/ # 想定している出力結果 <a href="https://テラテイル.com/テラテイル" target="_blank" rel="noopener"> <span style="border-bottom: solid 1px">https://テラテイル.com/テラテイル/</span> </a> # パターン④(URLのパラメータの中に全角文字列がある場合) $text = https://teratail.com/?param=テラテイル # 想定している出力結果 <a href="https://teratail.com/?param=テラテイル target="_blank" rel="noopener"> <span style="border-bottom: solid 1px">https://teratail.com/?param=テラテイル</span> </a>
該当のソースコード
参考にさせて頂いたページのように実装したところ、パターン①②は問題ないのですが、日本語を含ませようと、正規表現のパターンを変更すると想定しているURLにリンク化されない状態です。
php
public function replaceUrl($text) { $texts = explode(PHP_EOL, $text); // $pattern = '/https?:\/\/[^\s \\\|`^"\'(){}<>\[\]]*/'; // パターン①②はこれで問題ない $pattern = '/https?:\/\/[\w\-\\.\\/\\?\\,%&=\\#\\:\u3001-\u30FE\u4E00-\u9FA0\uFF01-\uFFE3]+/'; // 日本語を含めようとした場合の正規表現だがこれだとリンク化されなくなる $replacedTexts = []; foreach ($texts as $value) { $replace = preg_replace_callback($pattern, function ($matches) { if (isset($matches[1])) { return $matches[0]; } return '<a href="' . $matches[0] . '" target="_blank" rel="noopener"><span style="border-bottom: solid 1px">' . $matches[0] . '</span></a>'; }, $value); $replacedTexts[] = $replace; } return implode(PHP_EOL, $replacedTexts); } $url = $this-> replaceUrl (https://teratail.com/クエスチョンズ/)echo $url(https://teratail.com); // 日本語が含まれない
参考
https://qiita.com/_Jean_/items/e87b53058089ebe5c497
https://gist.github.com/kawanet/61d9ab15f9bdaaeb20a7
補足情報(FW/ツールのバージョンなど)
PHP 7.4.26
Laravel 5.5
0 コメント