Analisar entrada de texto

Olá, estou tentando analisar esta entrada para extrair subdomínios únicos dela

[ { “data”: “http://www.hackerone.com:80/\nhttps://www.hackerone.com/“,\nhttps://www.hackerone.com/”,“alts”:[],“httpStatus”:200\nhttp://hackerone.com/$handle/terms\nhttp://hackerone.com/$handle/terms_acceptance_data.csv\nhttps://sub3.hackerone.com/${e.handle}`;case\nhttps://hackerone.com/${et.hackerone_username}`\nhttp://hackerone.com/%25evil.com\nhttps://sub2.hackerone.com/ \nhttps://sub1.hackerone.com/%20%20\nhttps://hackerone.com/%20%20////////%20%20%20Twitter:%20@Paresh_parmar1%20fb:%20fb.com/paresh.parmar1993%20%20-%20https://blog.pareshparmar.com” } ]

quero que a saída obtenha apenas a saída para obter o
www.hackerone.com sub1.hackerone.com sub2.hackerone.com sub3.hackerone.com

@0xSphinx o mais fácil é usar um nó Code, fazer regex para extrair o host de cada URL e depois deduplicar com um Set. joga isso aqui:

const text = $input.first().json.data;
const hosts = [...text.matchAll(/https?:\/\/([^\/\s:"'`]+)/g)].map(m => m[1]);
return [...new Set(hosts)].map(h => ({ json: { subdomain: h } }));

isso captura tudo que fica entre :// e a próxima barra, dois-pontos, espaço ou aspas, e o Set elimina os duplicados. você vai pegar www.hackerone.com e sub1/sub2/sub3.hackerone.com (mais o domínio nu hackerone.com). se quiser só os que têm um prefixo de subdomínio e não o apex, adiciona .filter(h => h.split(‘.’).length > 2) antes do map.

Oi @0xSphinx, regex é realmente a abordagem correta. Uma coisa que vale a pena adicionar: seus dados brutos têm algumas entradas malformadas/lixo misturadas (como %00%25evil.com, a string de template ${e.handle} e aquele texto de Twitter/blog anexado ao final de uma URL). A regex vai pular a maioria delas, já que não correspondem a um padrão clean ://host, mas vale a pena verificar novamente seu array de saída depois de rodar, já que strings parecidas como evil.com podem passar se o formato mudar um pouco.
Se quiser ser extra seguro, pode adicionar um filtro básico de validação de domínio depois da deduplicação:
.filter(h => /^[a-z0-9.-]+\.[a-z]{2,}$/i.test(h))
Isso remove qualquer coisa que não pareça um domínio limpo, o que é útil ao fazer scraping de dados de fontes bagunçadas/não confiáveis como essa.

Obrigado @achamm e @sergeys, isso é realmente útil!