Text-Eingabe analysieren

Hallo, ich versuche, diese Eingabe zu parsen, um eindeutige Subdomains daraus zu extrahieren

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

ich möchte, dass die Ausgabe nur die Ausgabe enthält
www.hackerone.com sub1.hackerone.com sub2.hackerone.com sub3.hackerone.com

@0xSphinx Das Einfachste ist ein Code-Node, mit Regex den Host aus jeder URL extrahieren und dann mit einem Set deduplizieren. Gib das ein:

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

Das erfasst alles, was zwischen :// und dem nächsten Schrägstrich, Doppelpunkt, Leerzeichen oder Anführungszeichen sitzt, und das Set entfernt die Duplikate. Du bekommst www.hackerone.com und sub1/sub2/sub3.hackerone.com (plus bare hackerone.com). Wenn du nur diejenigen mit einem Subdomain-Präfix und nicht die Apex möchtest, füge .filter(h => h.split(‘.’).length > 2) vor der map hinzu.

Hey @0xSphinx, Regex ist der richtige Ansatz. Eine Sache, die es wert ist hinzuzufügen: Deine Rohdaten enthalten ein paar fehlerhafte/Junk-Einträge (z.B. %00%25evil.com, die ${e.handle} Template-Zeichenkette und dieser angehängte Twitter/Blog-Text an einer URL). Das Regex wird diese größtenteils überspringen, da sie nicht dem sauberen ://host-Muster entsprechen, aber es ist wert, dein Ausgabe-Array nach der Ausführung nochmal zu überprüfen, da Look-alike-Strings wie evil.com durchschlüpfen könnten, wenn sich das Format leicht verschiebt.
Wenn du extra sicher gehen möchtest, kannst du nach der Deduplizierung einen einfachen Domain-Validierungsfilter hinzufügen:
.filter(h => /^[a-z0-9.-]+\.[a-z]{2,}$/i.test(h))
Das entfernt alles, das nicht wie eine saubere Domain aussieht, was nützlich ist, wenn man Daten aus ungeordneten/nicht vertrauenswürdigen Quellen wie dieser scrappt.

Danke @achamm und @sergeys, das ist wirklich hilfreich!