Flashのソーシャル連携で、リンクとかサムネイルのURLを投稿するときに、
内部的には相対パスで持っていたいけど、投稿するときは絶対パスで指定しなきゃいけない場合があって、他にはあんまり使い所が少なそうだけど、相対パスを絶対パスに変換する関数をつくってみた。
正規表現は苦手なので、Stringクラスの操作だけでごにょごにょやってます。
function relativeToAbsolute(baseURL:String, path:String):String {
//pathが絶対パスの時はお帰りください
if (path.substr(0, 4) == "http") {
return path;
}
var _ary:Array = baseURL.split("//");
var ary:Array;
var absolute:String;
ary =_ary[1].split("/");
if (ary.length>1 && ary[ary.length - 1].split(".").length>1) {
//末尾がファイル名で終わる時
ary.pop();
}else if (ary[ary.length - 1]=="") {
//末尾が/で終わるとき
ary.pop();
}
if (path.charAt(0) == "/") {
//pathが「/」で始まる時
absolute = _ary[0] + "//" + ary[0] + path;
}else if (path.substr(0,2)=="./") {
//pathが「./」で始まる時
absolute = _ary[0]+"//"+ary.join("/") + "/";
}else if (path.substr(0, 3) == "../") {
//pathが「../」で始まる時
var i:int = 0;
while (path.substr(i * 3, 3) == "../") {
ary.pop();
i += 1;
}
absolute = _ary[0]+"//"+ary.join("/") + "/" + path.substr(i*3);
}else {
absolute = _ary[0]+"//"+ary.join("/") + "/" + path;
}
return absolute;
}
使い方はbaseURLに基準となるURLの絶対パス。
pathに相対パスを指定すると、相対パスを適用した絶対パスが帰ってきます。
relativeToAbsolute("http://www.shin-go.net/motionlab/?cat=8","hoge.html");
// "http://www.shin-go.net/motionlab/hoge.html"
relativeToAbsolute("http://www.shin-go.net/motionlab/?cat=8","./");
// "http://www.shin-go.net/motionlab/"
relativeToAbsolute("http://www.shin-go.net/motionlab/?cat=8","../");
// "http://www.shin-go.net/"
relativeToAbsolute("http://www.shin-go.net/motionlab/?cat=8","../hoge.html");
// "http://www.shin-go.net/hoge.html"
relativeToAbsolute("http://www.shin-go.net/motionlab/?cat=8","/hoge.html");
// "http://www.shin-go.net/hoge.html"
といった感じで、htmlのaタグに使える相対パスならなんでもいけます。




