文字列中のURLを自動的にリンクさせる - Perl,CGI

掲示板などのプログラムで、文字列中にURLが含まれる場合、自動的にハイパーリンクが張られている場合がある。これを実装するにはどうすれば良いだろうか?

単純にURL(URI)の正規表現を用いて、置換を行えば良い。以下のサンプルではurlAutoLinkという関数内で置換処理を実行している。

サンプル

;#
;#自動リンク
;#

#-- シンプル --#
$result1 = urlAutoLink('私のサイトはhttp://ichikoro.com/です');

#-- 細かい指定 --#
$result2 = urlAutoLink(
        '私のサイトはhttp://ichikoro.com/です'
         , '_blank'
         , {  title => '新しいウィンドウが開きます'
            , style => 'color: Pink'
           }
      );

#-- 表示 --#
print "$result1\n\n";
print "$result2\n";


sub urlAutoLink{
  my $str   = shift;
  my $target  = shift || '_self';   #target属性の値
  my $zokusei = shift;        #ハッシュのリファレンス
  my $add_zokusei = '';

  #-- 属性の作成 --#
  foreach my $name ( keys %$zokusei ){
    $add_zokusei .= qq|$name="$zokusei->{$name}" |;
  }
  chop $add_zokusei;

  #-- 置換 --#
  $str =~ s/(s?https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/<a href="$1" target="$target" $add_zokusei>$1<\/a>/g;

  return($str);
}

実行結果

私のサイトは<a href="http://ichikoro.com/" target="_self" >http://ichikoro.com/</a>です
私のサイトは<a href="http://ichikoro.com/" target="_blank" style="color: Pink" title="新しいウィンドウが開きます">http://ichikoro.com/</a>です

urlAutoLinkでは http(https) のみのサポートとなっているが、同じ要領でftpやメールアドレスなども自動的にリンクさせることが可能である。またこの関数では文字列中に " や ' などが含まれていてもエスケープされない点に注意されたい。

参考

www.din.or.jp