0

関数が必要です:

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'

平易な英語で、セグメントがある場合はsuffixn最後のn+1セグメントを取ります。一部の FQDN には複数のサフィックス要素があるという事実を考慮して、FQDN のベース ドメインを見つけます。

一致させる必要があるサフィックスはhereです。私はすでにSQLデータベースにそれらを持っています。

これは C# で記述できます。最もエレガントではないかもしれませんが、うまくいくでしょう。残念ながら、データに最も近い T-SQL、またはこのデータを消費するユーティリティの残りの部分が配置される Powershell のいずれかでこの関数を使用したいと考えています。C# で実行し、アセンブリにコンパイルしてから、T-SQL または Powershell からアクセスしても問題ないと思います...それが最速の実行である場合。純粋な T-SQL または単純な Powershell に合理的に賢い代替手段がある場合は、それを希望します。

編集: 明示的に言及するのを忘れていたことの 1 つ (ただし、上記のリンクでサフィックス リストを確認すると明らかです) は、一致する最も長いサフィックスを選択する必要があるということです。「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

これは、正しい接尾辞を見つけるのに問題なく機能します。ただ、その性能が少し気になります。

4

3 に答える 3

1

これをC#で行う方法は次のとおりです。

string getBaseDomain(string fqdn, string suffix)
{
    string[] domainSegs = fqdn.Split('.');
    return domainSegs[domainSegs.Length - suffix.Split('.').Length - 1] + "." + suffix;
}

ここにPowershellがあります:

function getBaseDomain
{
  Param(
    [string]$fqdn, 
    [string]$suffix 
  )
  $domainSegs = $fqdn.Split(".");
  return $domainSegs[$domainSegs.Length - $suffix.Split(".").Length - 1] + "."+$suffix;
}

これでstackoverflow.comの時間を無駄にしたのは、今ではかなりばかげているようです。謝罪いたします。

于 2016-12-19T19:39:28.490 に答える
1

ここにtsqlバリアントがあります...

declare @fqdn varchar(256) = 'somedomain.com'
declare @suffix varchar(128) = 'com'

select left(@fqdn,CHARINDEX(@suffix,@fqdn) - 2)

if(select CHARINDEX('.',reverse(left(@fqdn,CHARINDEX(@suffix,@fqdn) - 2)))) = 0
    begin
    select left(@fqdn,CHARINDEX(@suffix,@fqdn) - 2) + '.' + @suffix
    end
else
    begin
    select right(left(@fqdn,CHARINDEX(@suffix,@fqdn) - 2),CHARINDEX('.',reverse(left(@fqdn,CHARINDEX(@suffix,@fqdn) - 2))) - 1) + '.' + @suffix
    end
于 2016-12-19T19:46:37.207 に答える