你好,我正在嘗試解析此輸入以從中提取唯一的子域名
我想要輸出只獲取
「www.hackerone.com sub1.hackerone.com sub2.hackerone.com sub3.hackerone.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))
這會移除任何看起來不像乾淨網域字串的東西,在從這種混亂/不可信的來源爬取資料時很有用。