2012-09-11 162 views
1

我在这里遇到了一个非常奇怪的问题。我使用下面的代码通过php将txt文件上传到我的服务器。PHP上传文件并逐行阅读

<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); 

我确认$域正在填充txt文件中的数据,但是当我运行print_r($ list)时,它只返回“array()”

当我用FTP上传相同的确切文本文件并运行print_r($ list)时,它工作正常。

我还注意到,当我用我的FTP客户端上传相同的文本文件时,“domains.txt”的文件大小比使用我的html格式上传时要小。任何想法这里发生了什么?

+1

请不要忽略警告解决它们。 –

+0

file()将提供一个逐行数组,比你使用释放和爆炸效率更高 – 2012-09-11 04:04:26

+0

@ user1647347如果你喜欢我的回答,你可以接受它:D –

回答

2

这可能与您的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); 
+1

我敢打赌一美元就是问题 – 2012-09-11 04:04:47

+0

工作...某人欠一美元大ow。 感谢您的帮助! – user1647347

+0

@Dagon哈哈,美元正是这个问题:D –