AS3の正規表現でURLを抜き出すメモ

長らく、正規表現とかデータベース周りの作業は「サーバサイド技術者に任せてFlasherはやらなくてもいいんじゃないの?」 というアティテュードを貫いてきた訳ですが、ちょっと用事が出来たのでURLを抜き出してリンクを貼り付けるスクリプトを書きました。

mixiなんかでhttp://~を入力して日記を書くと、自動的にリンクを張ってくれるアレです

var pattern:RegExp = /https?:\/\/[-_.!~*'()\w;\/?:@&=+$,%#]+/gi;

とりあえずURLにマッチする正規表現はこれでいいはず。
コチラを参考に、AS3でちょこっと書き直しただけなので多分間違ってないと思う。

これを元に静的メソッドを持つクラスを作る(クラス名は適当)↓

package {

 public class URLMarkUp {
  public static const BLANK_WINDOW:String = "_blank"
  public static const SELF_WINDOW:String = "_self"

  /**
  * @param source URLを含む文章
  * @param window LINKを開くときのウィンドウ
  * @return URL部分をマークアップした文章全体
  */
  public static function markUpURL(source:String,
                         window:String = SELF_WINDOW):String {

   var pattern:RegExp = /https?:\/\/[-_.!~*'()\w;\/?:@&=+$,%#]+/gi;
   var markup:String = "<a href=\"$&\" target=\""+window+"\">$&</a>"
   var htmlStr:String = source.replace(pattern, markup)
   return htmlStr;

  }
 }
}

markUpURL()にURLを含むソース文章を第一引数に渡し、第二引数にはターゲットウィンドウを渡します。するとaタグをくっつけた文章全文を返してくれます。
実際に使うときはこんな感じで。 ↓

package{

 import flash.display.Sprite;
 import flash.text.TextField;
 
 public class Main extends flash.display.Sprite {

  public function Main():void {
   var textField:TextField = new TextField();
   addChild(textField)
   textField.width = 500
   textField.height = 500
   textField.wordWrap = true
   
var str:String = "my weisite is http://abc.com and secure https://secure.bar.com/asaこれがワタシのwebですHTTP://www.foge.netついでにクエリーもhttp://secure.bar.com/?p=(2)_34!$5&amp;"

   textField.htmlText = URLMarkUp.markUpURL(str, URLMarkUp.BLANK_WINDOW);
  }
 }
};

アーカイブはコチラ
*イマイチ正規表現って自信が無いのでもうちょっと勉強します。ご使用はあくまでも自己責任でお願いいたします。

追記:
補足 上記正規表現のフラグが「gi」に設定しているのは、うっかりユーザーが「HTTP://」など大文字で入力してしまった場合もURLとして認識するためです。本来の仕様からは外れてしまうわけですが、あえて許容しています。また、hrefに格納する際も小文字に変換はせず原文ママです。 ここら辺はどういう対応をすべきか、ユーザーエクスペリエンス的に面白いな~と思ったりします。ホンキで議論するのは疲れるけど。

Trackback

http://memo.kappa-lab.com/mt-tb.cgi/234

Leave your comment :

(いままで、ここでコメントしたことがないときは、コメントを表示する前に承認が必要になることがあります。そのときはしばらくお待ちください。)




RSS + Contuct

  • rss
  • email

Credit

Copyright (C) 2007 kappa-lab.com.
All Rights Reserved.