URL を解析する
over view
入力した URL を解析してリスト型に整形して返す。PHP の parse_url に相当 1) 。
list uuParseURL(string url);
- string url … URL
- 戻り値は list 型([scheme, host, port, path, query])で、それぞれの値は string 型
example
- 入力された URL を『スキーム / ホスト名 / ポート番号 / ファイルパス / クエリ文字列』に分解。
list result = uuParseURL("http://www.google.co.jp/search?client=safari&q=SecondLife"); integer i; for (i=0; i<5; i++){ llSay(0, "[" + (string)i + "] => " + llList2String(result, i)); } // [0] => http // [1] => www.google.co.jp // [2] => // [3] => /search // [4] => client=safari&q=SecondLife
- SHOUTcast に準じた URL であり、7.html に HTTP リクエストを送るかどうかを判断するのに使えるかも。
string url = "http://192.168.0.1:8080"; list parse_url_list = uuParseURL(url); if (llList2String(parse_url_list, 2) != "" && llList2String(parse_url_list, 3) == "/"){ // 7.html に問い合わせ }
code
いずれも同じ結果を吐き出します
- 2010-12-09
list uuParseURL(string url){ string path; list parse_url = llParseString2List(url, ["://", "?"], []); string scheme = llList2String(parse_url, 0); url = llList2String(parse_url, 1); string query = llList2String(parse_url, 2); integer cursor = llSubStringIndex(url, "/"); if (~cursor){ path = llGetSubString(url, cursor, -1); url = llGetSubString(url, 0, cursor - 1); }else{ path = "/"; } parse_url = llParseString2List(url, [":"], []); string host = llList2String(parse_url, 0); string port = llList2String(parse_url, 1); return [scheme, host, port, path, query]; }
- 2010-12-11 : 消費メモリは約 70 bytes 抑えたものの実行速度は改善できず …
list uuParseURL2(string url){ list parse_url = llParseString2List(url, ["://"], [":", "/", "?"]); if (llList2String(parse_url, 2) == ":"){ parse_url = llDeleteSubList(parse_url, 2, 2); }else{ parse_url = llListInsertList(parse_url, [""], 2); } if (llGetSubString(llList2String(parse_url, 3), 0, 0) != "/"){ parse_url = llListInsertList(parse_url, ["/"], 3); } integer query = llListFindList(parse_url, ["?"]); if (~query){ parse_url = llList2List(parse_url, 0, 2) + (string)llList2List(parse_url, 3, query-1) + (string)llList2List(parse_url, query+1, -1); }else{ parse_url = llList2List(parse_url, 0, 2) + (string)llList2List(parse_url, 3, -1) + ""; } return parse_url; }
memo
- 実行速度が遅い … タイプキャストが多いからかな?
- 正規表現が使えたら … って、正規表現も遅いか …
1)
user, pass, fragment は解析せず