2014-10-30 76 views
0

我是Erlang的新手,如何從url中匹配方法'getage'和'getcity'?Erlang BinString匹配

<<"http://server:port/getage?param=ABC">> 
<<"http://server:port/getcity?param=ABC">> 

在此先感謝。

回答

2

您可以使用標準的http_uri:parse/1 function這一點,但要注意,它需要一個list參數,而不是一個二進制的,所以我們首先通過binary_to_list/1您的網址轉換到一個列表:

1> http_uri:parse(binary_to_list(<<"http://server:12345/getage?param=ABC">>)). 
{ok,{http,[],"server",12345,"/getage","?param=ABC"}} 

假設函數成功,它返回{ok, {Scheme, UserInfo, Host, Port, Path, Query}}。您可以圖案匹配來提取你想要的部分,像這樣:

2> {ok, {_, _, _, _, "/"++Path, _}} = http_uri:parse(binary_to_list(<<"http://server:12345/getage?param=ABC">>)). 
{ok,{http,[],"server",12345,"/getage","?param=ABC"}} 
3> Path. 
"getage" 

變量Path現在包含你想要什麼,但作爲一個字符串,而不是二進制。如果您願意,您可以使用list_to_binary/1將其轉換回二進制文件:

4> list_to_binary(Path). 
<<"getage">> 
1

這裏有一個可能的方式,你可以這樣做:

<<"http://server:port/", Uri/binary>> = <<"http://server:port/getage?param=ABC">>, 
[Endpoint, _] = binary:split(Uri, <<"?">>), 
io:format("~s~n", [Endpoint]). 

%= getage 

爲什麼這是不可能做到這一點單獨使用模式匹配的是,Endpoint可以是任何長度和二進制模式匹配的原因要求所有二進制字段的大小除了最後一個。這就是爲什麼運行下面的代碼不起作用。

<<"http://server:port/", Uri/binary, "?", _/binary>> = <<"http://server:port/getage?param=ABC">>. 

%% * 1: a binary field without size is only allowed at the end of a binary pattern