Analizar entrada de texto

Hola, estoy intentando analizar esta entrada para extraer subdominios únicos

[ { “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” } ]

quiero que la salida solo obtenga la salida para obtener los
www.hackerone.com sub1.hackerone.com sub2.hackerone.com sub3.hackerone.com

@0xSphinx lo más fácil es usar un nodo Code, extraer el host de cada URL con regex y luego deduplicar con un Set. pega esto:

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 } }));

esto captura lo que está entre :// y la siguiente barra, dos puntos, espacio o comilla, y el Set elimina los duplicados. obtendrás www.hackerone.com y sub1/sub2/sub3.hackerone.com (además del dominio apex hackerone.com). si solo quieres los que tienen un prefijo de subdominio y no el apex, añade .filter(h => h.split(‘.’).length > 2) antes del map.

Hey @0xSphinx, regex es el enfoque correcto. Una cosa que vale la pena añadir: tus datos sin procesar tienen algunas entradas malformadas/basura mezcladas (por ejemplo %00%25evil.com, la cadena de plantilla ${e.handle}, y ese texto de Twitter/blog adicional al final de una URL). La expresión regular las omitirá en su mayoría ya que no coinciden con un patrón limpio ://host, pero vale la pena verificar tu matriz de salida después de ejecutarla, ya que cadenas similares como evil.com podrían colarse si el formato cambia ligeramente.
Si quieres ser extra cauteloso, puedes añadir un filtro básico de validación de dominio después del dedupe:
.filter(h => /^[a-z0-9.-]+\.[a-z]{2,}$/i.test(h))
Esto elimina cualquier cosa que no sea una cadena que se vea como un dominio limpio, lo cual es útil cuando se extraen datos de fuentes desordenadas/no confiables como esta.

¡Gracias @achamm y @sergeys, eso es muy útil!