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&"
textField.htmlText = URLMarkUp.markUpURL(str, URLMarkUp.BLANK_WINDOW);
}
}
};
アーカイブはコチラ
*イマイチ正規表現って自信が無いのでもうちょっと勉強します。ご使用はあくまでも自己責任でお願いいたします。
補足 上記正規表現のフラグが「gi」に設定しているのは、うっかりユーザーが「HTTP://」など大文字で入力してしまった場合もURLとして認識するためです。本来の仕様からは外れてしまうわけですが、あえて許容しています。また、hrefに格納する際も小文字に変換はせず原文ママです。 ここら辺はどういう対応をすべきか、ユーザーエクスペリエンス的に面白いな~と思ったりします。ホンキで議論するのは疲れるけど。