处理 URL 的函数
本节提到的函数经过优化,以实现最大的性能,并且在大多数情况下不遵循 RFC-3986 标准。实现 RFC-3986 的函数在其函数名称后附加 RFC
,通常较慢。
在处理不包含用户字符串或 @
符号的公开注册域名时,通常可以使用非 RFC
函数变体。下表详细说明了 URL 中哪些符号可以 (✔
) 或不可以 (✗
) 被各自的 RFC
和非 RFC
变体解析:
符号 | 非 RFC | RFC |
---|---|---|
' ' | ✗ | ✗ |
\t | ✗ | ✗ |
< | ✗ | ✗ |
> | ✗ | ✗ |
% | ✗ | ✔* |
{ | ✗ | ✗ |
} | ✗ | ✗ |
| | ✗ | ✗ |
\\ | ✗ | ✗ |
^ | ✗ | ✗ |
~ | ✗ | ✔* |
[ | ✗ | ✗ |
] | ✗ | ✔ |
; | ✗ | ✔* |
= | ✗ | ✔* |
& | ✗ | ✔* |
被标记为 *
的符号是 RFC 3986 中的子分隔符,并且在 @
符号后允许作为用户信息。
提取 URL 部分的函数
如果 URL 中没有相关部分,将返回空字符串。
protocol
从 URL 中提取协议。
典型的返回值示例: http、https、ftp、mailto、tel、magnet。
domain
从 URL 中提取主机名。
语法
参数
url
— URL. String。
URL 可以带协议或不带协议来指定。例如:
对于这些示例,domain
函数返回以下结果:
返回值
- 如果输入字符串可以解析为 URL,则返回主机名,否则返回空字符串。 String。
示例
domainRFC
从 URL 中提取主机名。类似于 domain,但符合 RFC 3986。
语法
参数
url
— URL. String。
返回值
- 如果输入字符串可以解析为 URL,则返回主机名,否则返回空字符串。 String。
示例
domainWithoutWWW
返回不带前缀 www.
的域名(如果存在)。
语法
参数
url
— URL. String。
返回值
- 如果输入字符串可以解析为 URL(不带前缀
www.
),则返回域名,否则返回空字符串。 String。
示例
domainWithoutWWWRFC
返回不带前缀 www.
的域名(如果存在)。类似于 domainWithoutWWW 但符合 RFC 3986。
语法
参数
url
— URL. String。
返回值
- 如果输入字符串可以解析为 URL(不带前缀
www.
),则返回域名,否则返回空字符串。 String。
示例
查询:
结果:
topLevelDomain
从 URL 中提取顶级域名。
参数
url
— URL. String。
URL 可以带协议或不带协议来指定。例如:
返回值
- 如果输入字符串可以解析为 URL,则返回域名。否则返回空字符串。 String。
示例
查询:
结果:
topLevelDomainRFC
从 URL 中提取顶级域名。类似于 topLevelDomain,但符合 RFC 3986。
参数
url
— URL. String。
URL 可以带协议或不带协议来指定。例如:
返回值
- 如果输入字符串可以解析为 URL,则返回域名。否则返回空字符串。 String。
示例
查询:
结果:
firstSignificantSubdomain
返回“第一个显著子域名”。第一个显著子域名对于 com
、net
、org
或 co
是二级域名,否则是三级域名。例如,firstSignificantSubdomain ('https://news.clickhouse.com/') = 'clickhouse'
,firstSignificantSubdomain ('https://news.clickhouse.com.tr/') = 'clickhouse'
。显著的二级域名及其他实现细节的列表可能会在未来发生变化。
语法
参数
url
— URL. String。
返回值
- 第一个显著子域名。 String。
示例
查询:
结果:
firstSignificantSubdomainRFC
返回“第一个显著子域名”。第一个显著子域名对于 com
、net
、org
或 co
是二级域名,否则是三级域名。例如,firstSignificantSubdomain ('https://news.clickhouse.com/') = 'clickhouse'
,firstSignificantSubdomain ('https://news.clickhouse.com.tr/') = 'clickhouse'
。显著的二级域名及其他实现细节的列表可能会在未来发生变化。类似于 firstSignficantSubdomain,但符合 RFC 1034。
语法
参数
url
— URL. String。
返回值
- 第一个显著子域名。 String。
示例
查询:
结果:
cutToFirstSignificantSubdomain
返回域名的一部分,包括顶级子域名,直到“第一个显著子域名”为止。
语法
参数
url
— URL. String。
返回值
- 包含顶级子域名的域名部分,直到第一个显著子域名(如果可能),否则返回空字符串。 String。
示例
查询:
结果:
cutToFirstSignificantSubdomainRFC
返回域名的一部分,包括顶级子域名,直到“第一个显著子域名”为止。类似于 cutToFirstSignificantSubdomain,但符合 RFC 3986。
语法
参数
url
— URL. String。
返回值
- 包含顶级子域名的域名部分,直到第一个显著子域名(如果可能),否则返回空字符串。 String。
示例
查询:
结果:
cutToFirstSignificantSubdomainWithWWW
返回域名的一部分,包括顶级子域名,直到“第一个显著子域名”为止,不去掉 www
。
语法
参数
url
— URL. String。
返回值
- 包含顶级子域名的域名部分,直到第一个显著子域名(带
www
,如果可能),否则返回空字符串。 String。
示例
查询:
结果:
cutToFirstSignificantSubdomainWithWWWRFC
返回域名的一部分,包括顶级子域名,直到“第一个显著子域名”为止,不去掉 www
。类似于 cutToFirstSignificantSubdomainWithWWW,但符合 RFC 3986。
语法
参数
url
— URL. String。
返回值
- 包含顶级子域名的域名部分,直到第一个显著子域名(带 "www",如果可能),否则返回空字符串。 String。
示例
查询:
结果:
cutToFirstSignificantSubdomainCustom
返回域名的一部分,包括顶级子域名,直到第一个显著子域名。接受自定义 TLD 列表 名称。如果您需要一个新的 TLD 列表或有自定义列表,此函数可能会很有用。
配置示例
语法
参数
返回值
- 包含顶级子域名的域名部分,直到第一个显著子域名。 String。
示例
查询:
结果:
参见
cutToFirstSignificantSubdomainCustomRFC
返回域名的一部分,包括顶级子域名,直到第一个显著子域名。接受自定义 TLD 列表 名称。如果您需要一个新的 TLD 列表或有自定义列表,此函数可能会很有用。类似于 cutToFirstSignificantSubdomainCustom,但符合 RFC 3986。
语法
参数
返回值
- 包含顶级子域名的域名部分,直到第一个显著子域名。 String。
参见
cutToFirstSignificantSubdomainCustomWithWWW
返回域名的一部分,包括顶级子域名,直到第一个显著子域名,不去掉 www
。接受自定义 TLD 列表名称。如果您需要一个新的 TLD 列表或有自定义列表,此函数可能会很有用。
配置示例
语法
参数
返回值
- 包含顶级子域名的域名部分,直到第一个显著子域名且不去掉
www
。 String。
示例
查询:
结果:
参见
cutToFirstSignificantSubdomainCustomWithWWWRFC
返回域名的一部分,包括顶级子域名,直到第一个显著子域名且不去掉 www
。接受自定义 TLD 列表名称。如果您需要一个新的 TLD 列表或有自定义列表,此函数可能会很有用。类似于 cutToFirstSignificantSubdomainCustomWithWWW,但符合 RFC 3986。
语法
参数
返回值
- 包含顶级子域名的域名部分,直到第一个显著子域名且不去掉
www
。 String。
参见
firstSignificantSubdomainCustom
返回第一个显著子域名。接受自定义 TLD 列表名称。如果您需要新的 TLD 列表或有自定义,则该函数可能会很有用。
配置示例:
语法
参数
返回值
- 第一个显著子域名。 String。
示例
查询:
结果:
参见
firstSignificantSubdomainCustomRFC
返回第一个显著子域名。接受自定义 TLD 列表名称。如果您需要新的 TLD 列表或有自定义,则该函数可能会很有用。类似于 firstSignificantSubdomainCustom,但符合 RFC 3986。
语法
参数
返回值
- 第一个显著子域名。 String。
参见
port
如果 URL 不包含端口或无法解析,则返回端口或 default_port
。
语法
参数
返回值
- 端口或默认端口,如果 URL 中没有端口或在验证错误情况下。 UInt16。
示例
查询:
结果:
portRFC
如果 URL 不包含端口或无法解析,则返回端口或 default_port
。类似于 port,但符合 RFC 3986。
语法
参数
返回值
- 端口或默认端口,如果 URL 中没有端口或在验证错误情况下。 UInt16。
示例
查询:
结果:
path
返回不带查询字符串的路径。
示例: /top/news.html
。
pathFull
与上述相同,但包括查询字符串和片段。
示例: /top/news.html?page=2#comments
。
protocol
从 URL 中提取协议。
语法
参数
url
— 要提取协议的 URL。 String。
返回值
- 协议,如果无法确定则返回空字符串。 String。
示例
查询:
结果:
queryString
返回查询字符串,不包括初始问号,#
和 #
后面的内容。
示例: page=1&lr=213
。
fragment
返回碎片标识符,不包括初始哈希符号。
queryStringAndFragment
返回查询字符串和碎片标识符。
示例: page=1#29390
。
extractURLParameter(url, name)
返回 URL 中 name
参数的值(如果存在),否则返回空字符串。如果有多个同名参数,将返回第一个出现的值。该函数假定 url
参数中的参数按照与 name
参数相同的方式编码。
extractURLParameters(url)
返回与 URL 参数对应的 name=value
字符串数组。值未解码。
extractURLParameterNames(url)
返回与 URL 参数名称对应的名称字符串数组。值未解码。
URLHierarchy(url)
返回一个数组,其中包含 URL,在路径和查询字符串中以符号 / 和 ? 截断。连续的分隔符字符计为一个。切割在所有连续分隔符字符之后的位置完成。
URLPathHierarchy(url)
与上述相同,但结果中不包含协议和主机。根元素 /
不包括。
encodeURLComponent(url)
返回编码后的 URL。
示例:
decodeURLComponent(url)
返回解码后的 URL。
示例:
encodeURLFormComponent(url)
返回编码后的 URL。遵循 rfc-1866,空格(
)编码为加号(+
)。
示例:
decodeURLFormComponent(url)
返回解码后的 URL。遵循 rfc-1866,普通加号(+
)解码为空格(
)。
示例:
netloc
从 URL 中提取网络位置 (username:password@host:port
)。
语法
参数
url
— URL. String。
返回值
username:password@host:port
。 String。
示例
查询:
结果:
移除 URL 部分的函数
如果 URL 没有类似的部分,则 URL 保持不变。
cutWWW
从 URL 的域中移除前导 www.
(如果存在)。
cutQueryString
移除查询字符串,包括问号。
cutFragment
移除碎片标识符,包括数字符号。
cutQueryStringAndFragment
移除查询字符串和碎片标识符,包括问号和数字符号。
cutURLParameter(url, name)
从 URL 中移除 name
参数(如果存在)。此函数不对参数名称中的字符进行编码或解码,例如 Client ID
和 Client%20ID
被视为不同的参数名称。
语法
参数
返回值
- 移除
name
URL 参数后的 URL。 String。
示例
查询:
结果: