解析文字輸入

你好,我正在嘗試解析此輸入以從中提取唯一的子域名

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

我想要輸出只獲取
www.hackerone.com sub1.hackerone.com sub2.hackerone.com sub3.hackerone.com

@0xSphinx 最簡單的方法是用 Code node,用 regex 從每個網址中提取主機名稱,然後用 Set 去除重複項。把這個放進去:

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

這會抓取 :// 和下一個斜線、冒號、空格或引號之間的所有內容,Set 會去掉重複項。你會得到 www.hackerone.com 和 sub1/sub2/sub3.hackerone.com(加上 hackerone.com)。如果你只想要有子網域前綴的,不想要 apex,在 map 前面加上 .filter(h => h.split(‘.’).length > 2)。

@0xSphinx,正規表達式是正確的做法。有一點值得補充,你的原始資料中混雜了一些格式錯誤的/垃圾項目(例如 %00%25evil.com、${e.handle} 樣板字串,以及附加到某個 URL 後面的 Twitter/部落格文字)。正規表達式大多會跳過這些,因為它們不符合乾淨的 ://host 模式,但值得在執行後再次檢查你的輸出陣列,因為如果格式稍微改變,evil.com 這樣的類似字串可能會混入。
如果你想更加謹慎,可以在去重複後新增一個基本的網域驗證篩選器:
.filter(h => /^[a-z0-9.-]+\.[a-z]{2,}$/i.test(h))
這會移除任何看起來不像乾淨網域字串的東西,在從這種混亂/不可信的來源爬取資料時很有用。

感謝 @achamm@sergeys,真的很有幫助!