Dart提取URL字符串中的主机名

11

假设我有以下字符串作为URL:

String urlSource = 'https://www.wikipedia.org/';

我想从这个URL字符串中提取主页名称:'维基百科',删除URL中的'https://'、'www'、'.com'和'.org'部分。
最佳提取方法是什么?如果使用RegExp,则需要使用什么正则表达式?

3
“wikipedia”不是页面名称,而是二级域名。无论如何,[^\.]+(?=\.[^\.]+$)可以使用。 - MonkeyZeus
如下所述,最好使用现有的代码来处理解析。两个教训:1)并非涉及字符串的每个问题都需要正则表达式,2)如果这个问题是其他人可能遇到的问题,那么寻找现有的代码来为您完成它。 - Andy Lester
1个回答

28

在这种情况下,您不需要使用RegExp

Dart已经为解析URL提供了预制的类:

Uri

使用该API实现您想要的功能非常简单:

final urlSource = 'https://www.wikipedia.org/';

final uri = Uri.parse(urlSource);
uri.host; // www.wikipedia.org

Uri.host 属性会给出 www.wikipedia.org。从中,您应该能够轻松提取出 wikipedia

Uri.host 还将删除整个路径,即主机后的任何内容在/之后。

提取二级域名

如果您想从主机中获取二级域名,例如 wikipedia,您可以使用 uri.host.split('.')[uri.host.split('.').length - 2]

但是请注意,这不是万无一失的,因为您可能有子域或没有(例如www),顶级域也可能由多个部分组成。例如,co.uk 使用 co 作为二级域名。


1
OP 没有询问如何提取主机。 - MonkeyZeus
@MonkeyZeus 我添加了一个解释 - 检索二级域名实际上并不总是没有所有顶级域名的映射表就不可能。因此,我的简单示例应该可以胜任。但是,从那里开始真的很琐碎。 - creativecreatorormaybenot
除非 OP 处理的是定制 DNS 或本地主机,否则我想顶级域名对于面向公众的网站是有保证的,因此您不需要关心它是什么,而是在按句点拆分时检索倒数第二个字符串。 - MonkeyZeus
@MonkeyZeus 我同意。这个问题如此微不足道,如果保持更通用的答案可能会更有用。 - creativecreatorormaybenot
1
我不熟悉 Dart,但是一个一行代码的解决方案可能是 uri.host.split('.')[uri.host.split('.').length - 2] - MonkeyZeus
警告:如果协议不存在,则Uri#host实际上不起作用。 Uri.parse('www.wikipedia.org/').host“” - Ben Butterworth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接