PHP上传文件并逐行读取


PHP upload file and read line by line

我遇到了一个非常奇怪的问题。我使用下面的代码通过php将一个txt文件上传到我的服务器。

    <form enctype="multipart/form-data" action="index.php" method="POST">
        <input type="file" name="uploadfile">
        <button>Submit</button>
    </form>

上传文件后(工作正常),我通过以下代码将内容转换为数组:

$fp = @fopen($file, 'r'); 
if ($fp) { 
    $domains = explode("'n", fread($fp, filesize($file))); 
}

然后我运行preg_match来过滤数组:

$list = preg_grep('/^[a-z]+'.com$/', $domains);

我确认$domains被txt文件中的数据填充,但是当我运行print_r($list)时,它只返回"array()"

当我用FTP上传相同的文本文件并运行print_r($list)时,它工作得很好。

我还注意到,当我用FTP客户端上传同一个文本文件时,"domains.txt"的文件大小比我用html表单上传时要小。你知道这里发生了什么吗?

这可能与FTP客户端在UNIX和Windows之间自动更改行结尾有关。

要解决此问题,只需在使用preg_grep之前使用trim来清理每一行。类似于:

foreach ($domains as $key => $domain) {
    $domains[$key] = trim($domain);
}
// or better use array_walk and closures PHP 5.3+
array_walk($domains, function(&$e) { $e = trim($e); });

问题可能是因为正则表达式具有明确的行首和行尾锚点。

顺便说一句,只需使用file函数,就可以在一条语句中将整个文件加载到一个行数组中。

$domains = file($file);