Analyser l'entrée de texte

Bonjour, je essaie d’analyser cette entrée pour en extraire les sous-domaines uniques

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

je veux que la sortie n’affiche que les résultats pour obtenir la sortie
www.hackerone.com sub1.hackerone.com sub2.hackerone.com sub3.hackerone.com

@0xSphinx le plus simple c’est un nœud Code, extraire le host de chaque URL avec une regex puis dédupliquer avec un Set. mets ça dedans :

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

ça récupère ce qui se trouve entre :// et le slash, deux-points, espace ou guillemet suivant, et le Set élimine les doublons. tu vas obtenir www.hackerone.com et sub1/sub2/sub3.hackerone.com (plus le domaine racine hackerone.com). si tu veux seulement ceux avec un préfixe de sous-domaine et pas le domaine apex, ajoute .filter(h => h.split(‘.’).length > 2) avant le map.

Salut @0xSphinx, regex est la bonne approche. Un truc à ajouter, tes données brutes contiennent quelques entrées malformées/poubelle mélangées (par exemple %00%25evil.com, la chaîne de modèle ${e.handle}, et ce texte Twitter/blog ajouté à la fin d’une URL). La regex va essentiellement ignorer ceux-là puisqu’ils ne correspondent pas à un modèle ://host propre, mais ça vaut le coup de revérifier ton tableau de résultats après l’exécution, parce que des chaînes qui ressemblent à evil.com pourraient s’y glisser si le format change légèrement.
Si tu veux être ultra prudent, tu peux ajouter un filtre de validation de domaine basique après la déduplication :
.filter(h => /^[a-z0-9.-]+\.[a-z]{2,}$/i.test(h))
Ça élimine tout ce qui n’est pas une chaîne qui ressemble clairement à un domaine, ce qui est utile quand tu scrapes des données provenant de sources malpropres/non fiables comme celle-ci.

Merci @achamm et @sergeys, c’est vraiment utile !