我正在寻找一个可以解析URL的.NET Framework类.
一些需要解析的URL示例:
server:8088server:8088/func1server:8088/func1/SubFunc1http://serverhttp://server/func1http://server/func/SubFunc1http://server:8088http://server:8088/func1http://server:8088/func1/SubFunc1magnet://servermagnet://server/func1magnet://server/func/SubFunc1magnet://server:8088magnet://server:8088/func1magnet://server:8088/func1/SubFunc1问题是Uri和UriBuilder类没有正确处理URL.例如,他们感到困惑:
stackoverflow.com:8088
Run Code Online (Sandbox Code Playgroud)
Url的格式为:
foo://example.com:8042/over/there?name=ferret#nose
\_/ \_________/ \__/\_________/\__________/ \__/
| | | | | |
scheme host port path query fragment
Run Code Online (Sandbox Code Playgroud)
在我们的例子中,我们只关心:
Uri.SchemeUri.HostUri.PortUri.Path运行一些测试,我们可以检查UriBuilder类如何处理各种Uri:
Expected Expected Expected Expected
//Test URI Scheme Server Port Path
//===================================== ======== ======== ==== ====================
t("server", "", "server", -1, "");
t("server/func1", "", "server", -1, "/func1");
t("server/func1/SubFunc1", "", "server", -1, "/func1/SubFunc1");
t("server:8088", "", "server", 8088, "");
t("server:8088/func1", "", "server", 8088, "/func1");
t("server:8088/func1/SubFunc1", "", "server", 8088, "/func1/SubFunc1");
t("http://server", "http", "server", -1, "/func1");
t("http://server/func1", "http", "server", -1, "/func1");
t("http://server/func/SubFunc1", "http", "server", -1, "/func1/SubFunc1");
t("http://server:8088", "http", "server", 8088, "");
t("http://server:8088/func1", "http", "server", 8088, "/func1");
t("http://server:8088/func1/SubFunc1", "http", "server", 8088, "/func1/SubFunc1");
t("magnet://server", "magnet", "server", -1, "");
t("magnet://server/func1", "magnet", "server", -1, "/func1");
t("magnet://server/func/SubFunc1", "magnet", "server", -1, "/func/SubFunc1");
t("magnet://server:8088", "magnet", "server", 8088, "");
t("magnet://server:8088/func1", "magnet", "server", 8088, "/func1");
t("magnet://server:8088/func1/SubFunc1", "magnet", "server", 8088, "/func1/SubFunc1");
Run Code Online (Sandbox Code Playgroud)
除了六个案例之外的所有案例都无法正确解析
Url Scheme Host Port Path
=================================== ====== ====== ==== ===============
server http server 80 /
server/func1 http server 80 /func1
server/func1/SubFunc1 http server 80 /func1/SubFunc1
server:8088 server -1 8088
server:8088/func1 server -1 8088/func1
server:8088/func1/SubFunc1 server -1 8088/func1/SubFunc1
http://server http server 80 /
http://server/func1 http server 80 /func1
http://server/func/SubFunc1 http server 80 /func1/SubFunc1
http://server:8088 http server 8088 /
http://server:8088/func1 http server 8088 /func1
http://server:8088/func1/SubFunc1 http server 8088 /func1/SubFunc1
magnet://server magnet server -1 /
magnet://server/func1 magnet server -1 /func1
magnet://server/func/SubFunc1 magnet server -1 /func/SubFunc1
magnet://server:8088 magnet server 8088 /
magnet://server:8088/func1 magnet server 8088 /func1
magnet://server:8088/func1/SubFunc1 magnet server 8088 /func1/SubFunc1
Run Code Online (Sandbox Code Playgroud)
我说我想要一个.NET Framework类.我也会接受任何代码口香糖,我可以拿起和咀嚼.只要它满足我简单的测试用例.
我今天早些时候也问了同样的问题,但我现在意识到我的说法不对.我错误地问如何"建立"一个网址.实际上,我想"解析"用户输入的URL.我现在不能回去并从根本上改变标题.所以我会再次提出同样的问题,只有更好,有更明确的目标,这里.
这个正则表达式可以吗?
^((?<schema>[a-z]*)://)?(?<host>[^/:]*)?(:(?<port>[0-9]*))?(?<path>/.*)?$
它并不完美,但似乎适用于您的测试用例。
| 归档时间: |
|
| 查看次数: |
1334 次 |
| 最近记录: |