現在位置: INDEXLSLユーザ関数URL を解析する

URL を解析する

over view

入力した URL を解析してリスト型に整形して返す。PHP の parse_url に相当 1)

list uuParseURL(string url);
  • string url … URL
  • 戻り値は list 型([scheme, host, port, path, query])で、それぞれの値は string 型

example

  1. 入力された 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
  2. 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

いずれも同じ結果を吐き出します

  1. 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];
    }
  2. 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 は解析せず
最終更新: 2010年12月11日 06 : 55 by arz Nitely
http://arzNitely.com/lsl/user_function/uuparseurl/index.html

Copyright 2007-2010 ©arzNitely.com all right reserved

www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0