掲示板などのプログラムで、文字列中に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やメールアドレスなども自動的にリンクさせることが可能である。またこの関数では文字列中に " や ' などが含まれていてもエスケープされない点に注意されたい。