Перейти к основному содержимому
Перейти к основному содержимому

Функции для работы с URL

примечание

Функции, упомянутые в этом разделе, оптимизированы для максимальной производительности и в основном не соответствуют стандарту RFC-3986. Функции, которые реализуют RFC-3986, имеют суффикс RFC в названии функции и, как правило, работают медленнее.

Вы можете использовать варианты функций без RFC при работе с общедоступно зарегистрированными доменами, которые не содержат строк пользователей и символов @. В таблице ниже указано, какие символы в URL могут () или не могут () быть обработаны соответствующими вариантами RFC и non-RFC:

Символnon-RFCRFC
' '
\t
<
>
%✔*
{
}
|
\
^
~✔*
[
]
;✔*
=✔*
&✔*

Символы, помеченные *, являются суб-делимитерами в RFC 3986 и разрешены для пользовательской информации после символа @.

Функции, извлекающие части URL

Если соответствующая часть отсутствует в URL, возвращается пустая строка.

protocol

Извлекает протокол из URL.

Примеры типичных возвращаемых значений: http, https, ftp, mailto, tel, magnet.

domain

Извлекает имя хоста из URL.

Синтаксис

domain(url)

Аргументы

URL может быть указан с протоколом или без него. Примеры:

svn+ssh://some.svn-hosting.com:80/repo/trunk
some.svn-hosting.com:80/repo/trunk
https://clickhouse.com/time/

Для этих примеров функция domain возвращает следующие результаты:

some.svn-hosting.com
some.svn-hosting.com
clickhouse.com

Возвращаемые значения

  • Имя хоста, если входная строка может быть проанализирована как URL, иначе пустая строка. String.

Пример

SELECT domain('svn+ssh://some.svn-hosting.com:80/repo/trunk');
┌─domain('svn+ssh://some.svn-hosting.com:80/repo/trunk')─┐
│ some.svn-hosting.com                                   │
└────────────────────────────────────────────────────────┘

domainRFC

Извлекает имя хоста из URL. Похоже на domain, но соответствует RFC 3986.

Синтаксис

domainRFC(url)

Аргументы

Возвращаемые значения

  • Имя хоста, если входная строка может быть проанализирована как URL, иначе пустая строка. String.

Пример

SELECT
    domain('http://user:password@example.com:8080/path?query=value#fragment'),
    domainRFC('http://user:password@example.com:8080/path?query=value#fragment');
┌─domain('http://user:password@example.com:8080/path?query=value#fragment')─┬─domainRFC('http://user:password@example.com:8080/path?query=value#fragment')─┐
│                                                                           │ example.com                                                                  │
└───────────────────────────────────────────────────────────────────────────┴──────────────────────────────────────────────────────────────────────────────┘

domainWithoutWWW

Возвращает домен без ведущего www., если он присутствует.

Синтаксис

domainWithoutWWW(url)

Аргументы

Возвращаемые значения

  • Имя домена, если входная строка может быть проанализирована как URL (без ведущего www.), иначе пустая строка. String.

Пример

SELECT domainWithoutWWW('http://paul@www.example.com:80/');
┌─domainWithoutWWW('http://paul@www.example.com:80/')─┐
│ example.com                                         │
└─────────────────────────────────────────────────────┘

domainWithoutWWWRFC

Возвращает домен без ведущего www., если он присутствует. Похоже на domainWithoutWWW, но соответствует RFC 3986.

Синтаксис

domainWithoutWWWRFC(url)

Аргументы

Возвращаемые значения

  • Имя домена, если входная строка может быть проанализирована как URL (без ведущего www.), иначе пустая строка. String.

Пример

Запрос:

SELECT
    domainWithoutWWW('http://user:password@www.example.com:8080/path?query=value#fragment'),
    domainWithoutWWWRFC('http://user:password@www.example.com:8080/path?query=value#fragment');

Результат:

┌─domainWithoutWWW('http://user:password@www.example.com:8080/path?query=value#fragment')─┬─domainWithoutWWWRFC('http://user:password@www.example.com:8080/path?query=value#fragment')─┐
│                                                                                         │ example.com                                                                                │
└─────────────────────────────────────────────────────────────────────────────────────────┴────────────────────────────────────────────────────────────────────────────────────────────┘

topLevelDomain

Извлекает домен верхнего уровня из URL.

topLevelDomain(url)

Аргументы

примечание

URL может быть указан с протоколом или без него. Примеры:

svn+ssh://some.svn-hosting.com:80/repo/trunk
some.svn-hosting.com:80/repo/trunk
https://clickhouse.com/time/

Возвращаемые значения

  • Имя домена, если входная строка может быть проанализирована как URL. В противном случае — пустая строка. String.

Пример

Запрос:

SELECT topLevelDomain('svn+ssh://www.some.svn-hosting.com:80/repo/trunk');

Результат:

┌─topLevelDomain('svn+ssh://www.some.svn-hosting.com:80/repo/trunk')─┐
│ com                                                                │
└────────────────────────────────────────────────────────────────────┘

topLevelDomainRFC

Извлекает домен верхнего уровня из URL. Похоже на topLevelDomain, но соответствует RFC 3986.

topLevelDomainRFC(url)

Аргументы

примечание

URL может быть указан с протоколом или без него. Примеры:

svn+ssh://some.svn-hosting.com:80/repo/trunk
some.svn-hosting.com:80/repo/trunk
https://clickhouse.com/time/

Возвращаемые значения

  • Имя домена, если входная строка может быть проанализирована как URL. В противном случае — пустая строка. String.

Пример

Запрос:

SELECT topLevelDomain('http://foo:foo%41bar@foo.com'), topLevelDomainRFC('http://foo:foo%41bar@foo.com');

Результат:

┌─topLevelDomain('http://foo:foo%41bar@foo.com')─┬─topLevelDomainRFC('http://foo:foo%41bar@foo.com')─┐
│                                                │ com                                               │
└────────────────────────────────────────────────┴───────────────────────────────────────────────────┘

firstSignificantSubdomain

Возвращает "первый значимый поддомен". Первый значимый поддомен — это домен второго уровня для com, net, org или co, иначе это домен третьего уровня. Например, firstSignificantSubdomain ('https://news.clickhouse.com/') = 'clickhouse', firstSignificantSubdomain ('https://news.clickhouse.com.tr/') = 'clickhouse'. Список "незначительных" доменов второго уровня и другие детали реализации могут измениться в будущем.

Синтаксис

firstSignificantSubdomain(url)

Аргументы

Возвращаемое значение

  • Первый значимый поддомен. String.

Пример

Запрос:

SELECT firstSignificantSubdomain('http://www.example.com/a/b/c?a=b')

Результат:

┌─firstSignificantSubdomain('http://www.example.com/a/b/c?a=b')─┐
│ example                                                       │
└───────────────────────────────────────────────────────────────┘

firstSignificantSubdomainRFC

Возвращает "первый значимый поддомен". Первый значимый поддомен — это домен второго уровня для com, net, org или co, иначе это домен третьего уровня. Например, firstSignificantSubdomain ('https://news.clickhouse.com/') = 'clickhouse', firstSignificantSubdomain ('https://news.clickhouse.com.tr/') = 'clickhouse'. Список "незначительных" доменов второго уровня и другие детали реализации могут измениться в будущем. Похоже на firstSignificantSubdomain, но соответствует RFC 1034.

Синтаксис

firstSignificantSubdomainRFC(url)

Аргументы

Возвращаемое значение

  • Первый значимый поддомен. String.

Пример

Запрос:

SELECT
    firstSignificantSubdomain('http://user:password@example.com:8080/path?query=value#fragment'),
    firstSignificantSubdomainRFC('http://user:password@example.com:8080/path?query=value#fragment');

Результат:

┌─firstSignificantSubdomain('http://user:password@example.com:8080/path?query=value#fragment')─┬─firstSignificantSubdomainRFC('http://user:password@example.com:8080/path?query=value#fragment')─┐
│                                                                                              │ example                                                                                         │
└──────────────────────────────────────────────────────────────────────────────────────────────┴─────────────────────────────────────────────────────────────────────────────────────────────────┘

cutToFirstSignificantSubdomain

Возвращает часть домена, которая включает домены верхнего уровня до "первого значимого поддомена".

Синтаксис

cutToFirstSignificantSubdomain(url)

Аргументы

Возвращаемое значение

  • Часть домена, которая включает домены верхнего уровня до первого значимого поддомена, если это возможно, в противном случае возвращает пустую строку. String.

Пример

Запрос:

SELECT
    cutToFirstSignificantSubdomain('https://news.clickhouse.com.tr/'),
    cutToFirstSignificantSubdomain('www.tr'),
    cutToFirstSignificantSubdomain('tr');

Результат:

┌─cutToFirstSignificantSubdomain('https://news.clickhouse.com.tr/')─┬─cutToFirstSignificantSubdomain('www.tr')─┬─cutToFirstSignificantSubdomain('tr')─┐
│ clickhouse.com.tr                                                 │ tr                                       │                                      │
└───────────────────────────────────────────────────────────────────┴──────────────────────────────────────────┴──────────────────────────────────────┘

cutToFirstSignificantSubdomainRFC

Возвращает часть домена, которая включает домены верхнего уровня до "первого значимого поддомена". Похоже на cutToFirstSignificantSubdomain, но соответствует RFC 3986.

Синтаксис

cutToFirstSignificantSubdomainRFC(url)

Аргументы

Возвращаемое значение

  • Часть домена, которая включает домены верхнего уровня до первого значимого поддомена, если это возможно, в противном случае возвращает пустую строку. String.

Пример

Запрос:

SELECT
    cutToFirstSignificantSubdomain('http://user:password@example.com:8080'),
    cutToFirstSignificantSubdomainRFC('http://user:password@example.com:8080');

Результат:

┌─cutToFirstSignificantSubdomain('http://user:password@example.com:8080')─┬─cutToFirstSignificantSubdomainRFC('http://user:password@example.com:8080')─┐
│                                                                         │ example.com                                                                │
└─────────────────────────────────────────────────────────────────────────┴────────────────────────────────────────────────────────────────────────────┘

cutToFirstSignificantSubdomainWithWWW

Возвращает часть домена, которая включает домены верхнего уровня до "первого значимого поддомена", не удаляя www.

Синтаксис

cutToFirstSignificantSubdomainWithWWW(url)

Аргументы

Возвращаемое значение

  • Часть домена, которая включает домены верхнего уровня до первого значимого поддомена (с www), если это возможно, в противном случае возвращает пустую строку. String.

Пример

Запрос:

SELECT
    cutToFirstSignificantSubdomainWithWWW('https://news.clickhouse.com.tr/'),
    cutToFirstSignificantSubdomainWithWWW('www.tr'),
    cutToFirstSignificantSubdomainWithWWW('tr');

Результат:

┌─cutToFirstSignificantSubdomainWithWWW('https://news.clickhouse.com.tr/')─┬─cutToFirstSignificantSubdomainWithWWW('www.tr')─┬─cutToFirstSignificantSubdomainWithWWW('tr')─┐
│ clickhouse.com.tr                                                        │ www.tr                                          │                                             │
└──────────────────────────────────────────────────────────────────────────┴─────────────────────────────────────────────────┴─────────────────────────────────────────────┘

cutToFirstSignificantSubdomainWithWWWRFC

Возвращает часть домена, которая включает домены верхнего уровня до "первого значимого поддомена", не удаляя www. Похоже на cutToFirstSignificantSubdomainWithWWW, но соответствует RFC 3986.

Синтаксис

cutToFirstSignificantSubdomainWithWWW(url)

Аргументы

Возвращаемое значение

  • Часть домена, которая включает домены верхнего уровня до первого значимого поддомена (с "www"), если это возможно, в противном случае возвращает пустую строку. String.

Пример

Запрос:

SELECT
    cutToFirstSignificantSubdomainWithWWW('http:%2F%2Fwwwww.nova@mail.ru/economicheskiy'),
    cutToFirstSignificantSubdomainWithWWWRFC('http:%2F%2Fwwwww.nova@mail.ru/economicheskiy');

Результат:

┌─cutToFirstSignificantSubdomainWithWWW('http:%2F%2Fwwwww.nova@mail.ru/economicheskiy')─┬─cutToFirstSignificantSubdomainWithWWWRFC('http:%2F%2Fwwwww.nova@mail.ru/economicheskiy')─┐
│                                                                                       │ mail.ru                                                                                  │
└───────────────────────────────────────────────────────────────────────────────────────┴──────────────────────────────────────────────────────────────────────────────────────────┘

cutToFirstSignificantSubdomainCustom

Возвращает часть домена, которая включает домены верхнего уровня до первого значимого поддомена. Принимает произвольное имя списка TLD. Эта функция может быть полезна, если вам нужен новый список TLD или если у вас есть пользовательский список.

Пример конфигурации

<!-- <top_level_domains_path>/var/lib/clickhouse/top_level_domains/</top_level_domains_path> -->
<top_level_domains_lists>
    <!-- https://publicsuffix.org/list/public_suffix_list.dat -->
    <public_suffix_list>public_suffix_list.dat</public_suffix_list>
    <!-- NOTE: path is under top_level_domains_path -->
</top_level_domains_lists>

Синтаксис

cutToFirstSignificantSubdomain(url, tld)

Аргументы

  • url — URL. String.
  • tld — Имя произвольного списка TLD. String.

Возвращаемое значение

  • Часть домена, которая включает домены верхнего уровня до первого значимого поддомена. String.

Пример

Запрос:

SELECT cutToFirstSignificantSubdomainCustom('bar.foo.there-is-no-such-domain', 'public_suffix_list');

Результат:

┌─cutToFirstSignificantSubdomainCustom('bar.foo.there-is-no-such-domain', 'public_suffix_list')─┐
│ foo.there-is-no-such-domain                                                                   │
└───────────────────────────────────────────────────────────────────────────────────────────────┘

Смотрите также

cutToFirstSignificantSubdomainCustomRFC

Возвращает часть домена, которая включает домены верхнего уровня до первого значимого поддомена. Принимает произвольное имя списка TLD. Эта функция может быть полезна, если вам нужен новый список TLD или если у вас есть пользовательский список. Похоже на cutToFirstSignificantSubdomainCustom, но соответствует RFC 3986.

Синтаксис

cutToFirstSignificantSubdomainRFC(url, tld)

Аргументы

  • url — URL. String.
  • tld — Имя произвольного списка TLD. String.

Возвращаемое значение

  • Часть домена, которая включает домены верхнего уровня до первого значимого поддомена. String.

Смотрите также

cutToFirstSignificantSubdomainCustomWithWWW

Возвращает часть домена, которая включает домены верхнего уровня до первого значимого поддомена без удаления www. Принимает произвольное имя списка TLD. Это может быть полезно, если вам нужен новый список TLD или если у вас есть пользовательский список.

Пример конфигурации

<!-- <top_level_domains_path>/var/lib/clickhouse/top_level_domains/</top_level_domains_path> -->
<top_level_domains_lists>
    <!-- https://publicsuffix.org/list/public_suffix_list.dat -->
    <public_suffix_list>public_suffix_list.dat</public_suffix_list>
    <!-- NOTE: path is under top_level_domains_path -->
</top_level_domains_lists>

Синтаксис

cutToFirstSignificantSubdomainCustomWithWWW(url, tld)

Аргументы

  • url — URL. String.
  • tld — Имя произвольного списка TLD. String.

Возвращаемое значение

  • Часть домена, которая включает домены верхнего уровня до первого значимого поддомена без удаления www. String.

Пример

Запрос:

SELECT cutToFirstSignificantSubdomainCustomWithWWW('www.foo', 'public_suffix_list');

Результат:

┌─cutToFirstSignificantSubdomainCustomWithWWW('www.foo', 'public_suffix_list')─┐
│ www.foo                                                                      │
└──────────────────────────────────────────────────────────────────────────────┘

Смотрите также

cutToFirstSignificantSubdomainCustomWithWWWRFC

Возвращает часть домена, которая включает домены верхнего уровня до первого значимого поддомена без удаления www. Принимает произвольное имя списка TLD. Это может быть полезно, если вам нужен новый список TLD или если у вас есть пользовательский список. Похоже на cutToFirstSignificantSubdomainCustomWithWWW, но соответствует RFC 3986.

Синтаксис

cutToFirstSignificantSubdomainCustomWithWWWRFC(url, tld)

Аргументы

  • url — URL. String.
  • tld — Имя произвольного списка TLD. String.

Возвращаемое значение

  • Часть домена, которая включает домены верхнего уровня до первого значимого поддомена без удаления www. String.

Смотрите также

firstSignificantSubdomainCustom

Возвращает первый значимый поддомен. Принимает произвольное имя списка TLD. Может быть полезно, если вам нужен новый список TLD или у вас есть пользовательский.

Пример конфигурации:

<!-- <top_level_domains_path>/var/lib/clickhouse/top_level_domains/</top_level_domains_path> -->
<top_level_domains_lists>
    <!-- https://publicsuffix.org/list/public_suffix_list.dat -->
    <public_suffix_list>public_suffix_list.dat</public_suffix_list>
    <!-- NOTE: path is under top_level_domains_path -->
</top_level_domains_lists>

Синтаксис

firstSignificantSubdomainCustom(url, tld)

Аргументы

  • url — URL. String.
  • tld — Имя произвольного списка TLD. String.

Возвращаемое значение

  • Первый значимый поддомен. String.

Пример

Запрос:

SELECT firstSignificantSubdomainCustom('bar.foo.there-is-no-such-domain', 'public_suffix_list');

Результат:

┌─firstSignificantSubdomainCustom('bar.foo.there-is-no-such-domain', 'public_suffix_list')─┐
│ foo                                                                                      │
└──────────────────────────────────────────────────────────────────────────────────────────┘

Смотрите также

firstSignificantSubdomainCustomRFC

Возвращает первый значимый поддомен. Принимает произвольное имя списка TLD. Может быть полезно, если вам нужен новый список TLD или у вас есть пользовательский. Похоже на firstSignificantSubdomainCustom, но соответствует RFC 3986.

Синтаксис

firstSignificantSubdomainCustomRFC(url, tld)

Аргументы

  • url — URL. String.
  • tld — Имя произвольного списка TLD. String.

Возвращаемое значение

  • Первый значимый поддомен. String.

Смотрите также

port

Возвращает порт или default_port, если URL не содержит порта или не может быть проанализирован.

Синтаксис

port(url [, default_port = 0])

Аргументы

  • url — URL. String.
  • default_port — Номер порта по умолчанию, который будет возвращен. UInt16.

Возвращаемое значение

  • Порт или порт по умолчанию, если в URL нет порта или в случае ошибки проверки. UInt16.

Пример

Запрос:

SELECT port('http://paul@www.example.com:80/');

Результат:

┌─port('http://paul@www.example.com:80/')─┐
│                                      80 │
└─────────────────────────────────────────┘

portRFC

Возвращает порт или default_port, если URL не содержит порта или не может быть проанализирован. Похоже на port, но соответствует RFC 3986.

Синтаксис

portRFC(url [, default_port = 0])

Аргументы

  • url — URL. String.
  • default_port — Номер порта по умолчанию, который будет возвращен. UInt16.

Возвращаемое значение

  • Порт или порт по умолчанию, если в URL нет порта или в случае ошибки проверки. UInt16.

Пример

Запрос:

SELECT
    port('http://user:password@example.com:8080'),
    portRFC('http://user:password@example.com:8080');

Результат:

┌─port('http://user:password@example.com:8080')─┬─portRFC('http://user:password@example.com:8080')─┐
│                                             0 │                                             8080 │
└───────────────────────────────────────────────┴──────────────────────────────────────────────────┘

path

Возвращает путь без строки запроса.

Пример: /top/news.html.

pathFull

То же самое, что и выше, но включает строку запроса и фрагмент.

Пример: /top/news.html?page=2#comments.

protocol

Извлекает протокол из URL.

Синтаксис

protocol(url)

Аргументы

  • url — URL, из которого извлекается протокол. String.

Возвращаемое значение

  • Протокол или пустая строка, если его нельзя определить. String.

Пример

Запрос:

SELECT protocol('https://clickhouse.com/');

Результат:

┌─protocol('https://clickhouse.com/')─┐
│ https                               │
└─────────────────────────────────────┘

queryString

Возвращает строку запроса без начального знака вопроса, # и всего, что после #.

Пример: page=1&lr=213.

fragment

Возвращает идентификатор фрагмента без начального символа хеширования.

queryStringAndFragment

Возвращает строку запроса и идентификатор фрагмента.

Пример: page=1#29390.

extractURLParameter(url, name)

Возвращает значение параметра name в URL, если он присутствует, иначе возвращается пустая строка. Если есть несколько параметров с этим именем, возвращается первое вхождение. Функция предполагает, что параметр в параметре url закодирован так же, как и в аргументе name.

extractURLParameters(url)

Возвращает массив строк name=value, соответствующих параметрам URL. Значения не декодируются.

extractURLParameterNames(url)

Возвращает массив строк имен, соответствующих именам параметров URL. Значения не декодируются.

URLHierarchy(url)

Возвращает массив, содержащий URL, обрезанный в конце символами /,? в пути и строке запроса. Последовательные символы-разделители учитываются как один. Нарезка производится сразу после всех последовательных символов-разделителей.

URLPathHierarchy(url)

То же самое, что и выше, но без протокола и хоста в результате. Элемент / (корень) не включен.

URLPathHierarchy('https://example.com/browse/CONV-6788') =
[
    '/browse/',
    '/browse/CONV-6788'
]

encodeURLComponent(url)

Возвращает закодированный URL.

Пример:

SELECT encodeURLComponent('http://127.0.0.1:8123/?query=SELECT 1;') AS EncodedURL;
┌─EncodedURL───────────────────────────────────────────────┐
│ http%3A%2F%2F127.0.0.1%3A8123%2F%3Fquery%3DSELECT%201%3B │
└──────────────────────────────────────────────────────────┘

decodeURLComponent(url)

Возвращает декодированный URL.

Пример:

SELECT decodeURLComponent('http://127.0.0.1:8123/?query=SELECT%201%3B') AS DecodedURL;
┌─DecodedURL─────────────────────────────┐
│ http://127.0.0.1:8123/?query=SELECT 1; │
└────────────────────────────────────────┘

encodeURLFormComponent(url)

Возвращает закодированный URL. Соответствует rfc-1866, пробел ( ) закодирован как плюс (+).

Пример:

SELECT encodeURLFormComponent('http://127.0.0.1:8123/?query=SELECT 1 2+3') AS EncodedURL;
┌─EncodedURL────────────────────────────────────────────────┐
│ http%3A%2F%2F127.0.0.1%3A8123%2F%3Fquery%3DSELECT+1+2%2B3 │
└───────────────────────────────────────────────────────────┘

decodeURLFormComponent(url)

Возвращает декодированный URL. Соответствует rfc-1866, простой плюс (+) декодируется как пробел ( ).

Пример:

SELECT decodeURLFormComponent('http://127.0.0.1:8123/?query=SELECT%201+2%2B3') AS DecodedURL;
┌─DecodedURL────────────────────────────────┐
│ http://127.0.0.1:8123/?query=SELECT 1 2+3 │
└───────────────────────────────────────────┘

netloc

Извлекает сетевую локальность (username:password@host:port) из URL.

Синтаксис

netloc(url)

Аргументы

Возвращаемое значение

  • username:password@host:port. String.

Пример

Запрос:

SELECT netloc('http://paul@www.example.com:80/');

Результат:

┌─netloc('http://paul@www.example.com:80/')─┐
│ paul@www.example.com:80                   │
└───────────────────────────────────────────┘

Функции, которые удаляют часть URL

Если в URL нет ничего подобного, URL остается без изменений.

cutWWW

Удаляет ведущий www. (если присутствует) из домена URL.

cutQueryString

Удаляет строку запроса, включая знак вопроса.

cutFragment

Удаляет идентификатор фрагмента, включая знак решетки.

cutQueryStringAndFragment

Удаляет строку запроса и идентификатор фрагмента, включая знак вопроса и знак решетки.

cutURLParameter(url, name)

Удаляет параметр name из URL, если он присутствует. Эта функция не кодирует и не декодирует символы в именах параметров, например, Client ID и Client%20ID рассматриваются как разные имена параметров.

Синтаксис

cutURLParameter(url, name)

Аргументы

  • url — URL. String.
  • name — имя параметра URL. String или Array строк.

Возвращаемое значение

  • url с удаленным параметром URL name. String.

Пример

Запрос:

SELECT
    cutURLParameter('http://bigmir.net/?a=b&c=d&e=f#g', 'a') AS url_without_a,
    cutURLParameter('http://bigmir.net/?a=b&c=d&e=f#g', ['c', 'e']) AS url_without_c_and_e;

Результат:

┌─url_without_a────────────────┬─url_without_c_and_e──────┐
│ http://bigmir.net/?c=d&e=f#g │ http://bigmir.net/?a=b#g │
└──────────────────────────────┴──────────────────────────┘