Мне нужна функция:
f(fqdn,suffix) -> basedomain
с этими примерами входных и выходных данных:
f('foobar.quux.somedomain.com','com') -> 'somedomain.com'
f('somedomain.com','com') -> 'somedomain.com'
f('foobar.quux.somedomain.com.br','com.br') -> 'somedomain.com.br'
f('somedomain.com.br','com.br') -> 'somedomain.com.br'
Проще говоря, если suffix
состоит из n
сегментов, возьмите последние n+1
сегментов. Найдите базовый домен для полного доменного имени, учитывая тот факт, что некоторые полные доменные имена имеют более одного элемента суффикса.
Суффиксы, которые мне нужно сопоставить, находятся здесь. Они уже есть в моей базе данных SQL.
Я мог бы написать это на С#; это может быть не самым элегантным, но это сработает. К сожалению, я хотел бы иметь эту функцию либо в T-SQL, где она ближе всего к данным, либо в Powershell, где будет находиться остальная часть утилиты, потребляющей эти данные. Я полагаю, что было бы нормально сделать это на C #, скомпилировать в сборку, а затем получить к ней доступ из T-SQL или даже из Powershell ... если это будет самым быстрым выполнением. Если есть какая-то разумная альтернатива на чистом T-SQL или простом Powershell, мне бы это понравилось.
РЕДАКТИРОВАТЬ: Одна вещь, которую я забыл упомянуть явно (но это ясно при просмотре списка суффиксов по моей ссылке выше), заключается в том, что мы должны выбрать самый длинный совпадающий суффикс. И «br», и «com.br» появляются в списке суффиксов (аналогичные вещи происходят для uk, pt и т. д.). Таким образом, SQL должен использовать оконную функцию, чтобы убедиться, что найден самый длинный совпадающий суффикс.
Вот как далеко я продвинулся, когда делал SQL. Я запутался во всех функциях substring
/reverse
.
SELECT Domain, suffix
FROM (
SELECT SD.Domain, SL.suffix,
RN=ROW_NUMBER() OVER (
PARTITION BY sd.Domain ORDER BY LEN(SL.suffix) DESC)
FROM SiteDomains SD
INNER JOIN suffixlist SL ON SD.Domain LIKE '%.'+SL.suffix
) AS X
WHERE RN=1
Это работает нормально для поиска правильного суффикса. Хотя меня немного беспокоит его производительность.
[system.uri]
- person Matt   schedule 19.12.2016$fqdn -replace "^.*?(?=[^.]+\.$suffix`$)"
является доказательством против foo.bar.com.br.something.com.br ... - person TessellatingHeckler   schedule 19.12.2016