首页 > 解决方案 > PHP:从 txt 文件中列出的 url 列表中抓取电子邮件

问题描述

我正在尝试从 txt 文件中列出的 url 中提取电子邮件。

但只有 txt 文件的最后一个 url 显示了他的相关电子邮件。

输出如下所示:

网址1

网址2

网址3

网址4

电子邮件:电子邮件地址1

电子邮件:电子邮件地址2

我不明白我做错了什么。

我有什么明显的遗漏吗?谢谢您的帮助。

编码 :

<?php
$handle = fopen("url-list.txt", "r");
if ($handle) {
    while (($url = fgets($handle)) !== false) {
        // process the line read.
        echo "<br>";
        echo $url ;
        echo "<br>";
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
    curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
    curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
    $result = curl_exec($ch);
    curl_close($ch);

    $emails = extract_emails_from($result);
    
    foreach(array_unique($emails) as $email) {
        echo "email: ", trim($email);
        echo "<br>";
    }
}
fclose($handle);
} else {
    // error opening the file.
} 
function extract_emails_from($string) {
    preg_match_all("/[\._a-zA-Z0-9-]+@[\._a-zA-Z0-9-]+/i", $string, $matches);
    return $matches[0];
}
?>

标签: phpweb-scraping

解决方案


这是一个范围问题。

$emails = extract_emails_from($result);

$emails变量在循环的每次迭代中都会被重写while

解决方案:

在循环之外创建一个新数组并将结果合并到其中。

$allEmails = [];

while (($url = fgets($handle)) !== false) {
   // ... rest of your code
   $emails = extract_emails_from($result);
   $allEmails = array_merge($allEmails, $emails);
}

推荐阅读