Всем привет.
Написал такую фиговину на erlang - на вход подаётся строка uri, на выходе - record из четырёх компонентов scheme, authority, path, query. Регэкспы из RFC2396.
Сдаётся мне что-то тут недостаточно функционально, может кто подскажет, как учучшить?
-module(uri).
-export([parse/1]).
-record(uri, {
scheme,
authority,
path,
query_component % 'query' is the reserved erlang word
}).
-define(URI_SCHEME_RE, "^([^:/?#]+):").
-define(URI_AUTHORITY_RE, "^//([^/?#]*)").
-define(URI_PATH_RE, "^[^?#]*").
-define(URI_QUERY_RE, "^[?]([^#]*)").
parse(URI) ->
parse_scheme(URI, #uri{}).
parse_scheme(URI, Record) ->
case regexp:first_match(URI, ?URI_SCHEME_RE) of
{match, _, Length} ->
{Scheme, [$: | Rest]} = lists:split(Length - 1, URI),
parse_authority(Rest, Record#uri{scheme = Scheme});
nomatch ->
parse_authority(URI, Record)
end.
parse_authority(URI, Record) ->
case regexp:first_match(URI, ?URI_AUTHORITY_RE) of
{match, _, Length} ->
{[$/, $/ | Authority], Rest} = lists:split(Length, URI),
parse_path(Rest, Record#uri{authority = Authority});
nomatch ->
parse_path(URI, Record)
end.
parse_path(URI, Record) ->
case regexp:first_match(URI, ?URI_PATH_RE) of
{match, _, Length} ->
{Path, Rest} = lists:split(Length, URI),
parse_query(Rest, Record#uri{path = Path});
nomatch ->
parse_query(URI, Record)
end.
parse_query(URI, Record) ->
case regexp:first_match(URI, ?URI_QUERY_RE) of
{match, _, Length} ->
{[$? | Query], _} = lists:split(Length, URI),
Record#uri{query_component = Query};
nomatch ->
Record
end.