我遇到了一个非常奇怪的问题。我使用下面的代码通过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);