我在这里遇到了一个非常奇怪的问题。我正在使用下面的代码通过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表单上传时更小。知道这里发生了什么吗?
答案 0 :(得分:2)
这可能与您的FTP客户端在UNIX和Windows之间自动更改行结尾有关。
要解决此问题,请在使用trim
之前使用preg_grep
清除每一行。类似的东西:
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);