<?php
$url = 'https://www.jb51.net'; // 目標網頁
$content = file_get_contents($url); // 獲取 HTML
function getEmail($str) {
// 正則模式:匹配標準郵箱格式
// [a-z0-9\-_\.]+ 用戶名部分
// @ 必須符號
// [a-z0-9]+ 域名主體
// \. 點分隔
// [a-z0-9\-_\.]+ 頂級域/子域
$pattern = "/([a-z0-9\-_\.]+@[a-z0-9]+\.[a-z0-9\-_\.]+)/i";
preg_match_all($pattern, $str, $emailArr);
return $emailArr[0]; // 返回完整匹配數組
}
$emails = getEmail($content);
print_r($emails);
Array
(
[0] => admin@jb51.net
[1] => service@jb51.net
[2] => contact@sub.jb51.net
)
| 片段 | 含義 | 匹配示例 |
|---|---|---|
[a-z0-9\-_\.]+ | 用戶名:字母、數字、中劃線、下劃線、點 | user.name, user_name, user-name |
@ | 字面符號 @ | @ |
[a-z0-9]+ | 域名主標籤:至少一個字母/數字 | gmail, 163, qq |
\. | 字面點號(轉義) | . |
[a-z0-9\-_\.]+ | 頂級域/子域:支持多級域名 | com, co.uk, sub.domain.cn |
/i | 大小寫不敏感 | 匹配 Admin@Domain.COM |
function getEmailAdvanced($html) {
// 更嚴格模式:排除連續點、首尾點、IP 域名等異常
$pattern = "/
(?:^|[\s\<\>\(\)\[\]\{\}\;\:\,\"\']) # 左邊界
(
[a-z0-9!#\$%&'*+\/=?^_`\{|\}~-]+ # 用戶名
(?:\.[a-z0-9!#\$%&'*+\/=?^_`\{|\}~-]+)* # 允許點但不連續/首尾
@
(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+ # 域名標籤
[a-z0-9](?:[a-z0-9-]*[a-z0-9])? # 頂級域
)
(?:$|[\s\<\>\(\)\[\]\{\}\;\:\,\"\']) # 右邊界
/ix";
preg_match_all($pattern, $html, $matches);
return array_unique($matches[1]); // 去重
}
file_get_contents 獲取的內容可能非 UTF-8,配合 mb_detect_encoding + iconv 轉碼array_unique,可進一步 SMTP 驗證郵箱真實性robots.txt、站點服務條款,僅用於合法數據分析,嚴禁垃圾郵件收集DOMDocument、QueryList)定向提取$urls = ['https://site1.com', 'https://site2.com', ...];
$allEmails = [];
foreach ($urls as $url) {
try {
$html = @file_get_contents($url);
if ($html) {
$emails = getEmail($html);
$allEmails = array_merge($allEmails, $emails);
echo "[$url] 發現 " . count($emails) . " 個郵箱\n";
}
} catch (Exception $e) {
echo "[$url] 失敗: " . $e->getMessage() . "\n";
}
usleep(500000); // 禮貌延遲 0.5s
}
$allEmails = array_unique($allEmails);
file_put_contents('emails.txt', implode("\n", $allEmails));
echo "總計去重郵箱: " . count($allEmails);
幾十行代碼即可構建基礎郵箱采集器,配合進階正則、異步並發、代理池可擴展為生產級爬蟲系統。