連載
» 2004年06月01日 10時00分 公開

JavaTips 〜JSP/サーブレット編:文字列中のURLに自動的にリンクを設定する

[山田祥寛,@IT]

 掲示板システムのようなアプリケーションで、入力されたURLやメールアドレスに対して自動的にリンクを設定したいということはないでしょうか。

 書き込まれる文字列自体にHTMLのアンカータグの利用を認めるという選択肢もありますが、HTMLタグを書き込むというのはユーザーにとって面倒なことですし、クラッカーによる攻撃を受ける可能性があるという観点からもあまり好ましいことではありません。

 本稿では、フリーフォーマットの文字列に含まれるURL文字列を検出し、自動的にアンカータグを生成する方法を説明しましょう。

解説

 リンクの自動生成には、J2SE 1.4から導入されたString#replaceAllメソッドを利用します。例えば、次のような形式で指定します。

String strVal="新WINGSサイト http://www.wings.msn.to/ をよろしく!";
out.println(strVal.replaceAll("(http://|https://){1}[\\w\\.\\-/:]+","<a href='$0'>$0</a>"));

 replaceAllメソッドの第1引数には文字列パターンを検出するための正規表現を、第2引数には置き換え後の文字列を指定します。正規表現パターンに関する詳細については、連載:基礎から学ぶサーブレット/JSP第8回 クラスライブラリを攻略「ユーティリティ編」」で紹介していますので、併せて参照するとより分かりやすいでしょう。

 ここで注目してほしいのは、この際置き換え後の文字列に「$0…$9」のようなプレイスホルダを設定できるという点です。$0は正規表現パターンにマッチングした文字列全体を、$1、$2…$9にはサブパターン(正規表現内でカッコで囲まれた部分)にマッチングした部分文字列が左から順番に格納されます。

 つまり、上の例であれば、

新WINGSサイト <a href='http://www.wings.msn.to/'>http://www.wings.msn.to/</a> をよろしく!

という文字列が返されることになります。ここでは、固定値として文字列strValを置き換えているだけですが、例えば、データベースサーバから取り出した値(掲示板アプリケーションであれば、投稿記事本文)をreplaceAllメソッドで処理することで、データ内に含まれるURL文字列をアンカータグに整形することができます。

 同様に、以下のようにすれば、メールアドレスにリンクを張ることもできます。

String strVal2="お問い合わせは webmaster@wings.msn.to まで";
out.println(strVal2.replaceAll("[\\w\\.\\-]+@([\\w\\-]+\\.)+[\\w\\-]+","<a href='mailto:$0'>$0</a>"));

 そのほか、ある特定の文字列パターンをハイライト表示したり、フォントを変更したりと、工夫次第でさまざまな局面に利用できますので、いろいろ試してみてください。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。