逐行读入文本文件php - 未检测到换行符

时间:2009-05-03 19:23:46

标签: php newline text-editor

我有一个我编写的php函数,它将获取一个文本文件,并将每一行列为表中自己的行。

问题是经典“在我的机器上正常工作”,但当然当我要求其他人生成我正在寻找的.txt文件时,它会继续读取整个文件中的1行。当我在我的文本编辑器中打开它时,它看起来就像我期望它在每一行上都有一个新名称,但它是换行符或其他东西。

到目前为止,我已经得出结论,它可能与他们在Mac系统上使用的任何文本编辑器有关。

这有意义吗?是否有任何简单的方法来检测文本编辑器识别为新行并将其替换为php将识别的标准符号?

更新:添加以下行解决了问题。

ini_set('auto_detect_line_endings',true);

功能:

function displayTXTList($fileName) {
    if(file_exists($fileName)) {
        $file = fopen($fileName,'r');
        while(!feof($file)) { 
            $name = fgets($file);
            echo('<tr><td align="center">'.$name.'</td></tr>');
        }
        fclose($file);
    } else {
        echo('<tr><td align="center">placeholder</td></tr>');
    }       
}

4 个答案:

答案 0 :(得分:32)

答案 1 :(得分:11)

file()出了什么问题?

foreach (file($fileName) as $name) {
    echo('<tr><td align="center">'.$name.'</td></tr>');
}

答案 2 :(得分:6)

来自fgets的手册页:

  

注意:如果在阅读Macintosh计算机上或由Macintosh计算机创建的文件时PHP无法正确识别行结尾,则启用auto_detect_line_endings运行时配置选项可能有助于解决问题。

另外,您是否尝试过file功能?它返回一个数组;数组中的每个元素对应于文件中的一行。

编辑:如果您无权访问php.ini,您使用的是哪个Web服务器?在Apache中,您可以使用a .htaccess file更改PHP设置。还有ini_set功能允许在运行时更改设置。

答案 3 :(得分:5)

这是换行问题的经典案例。

ASCII定义了几个不同的“换行符”字符。我们关心的两个特定的是ASCII 10(换行,LF)和13(回车,CR)。

所有基于Unix的系统,包括OS X,Linux等,都将使用LF作为换行符。 Mac OS Classic使用CR只是为了与众不同,Windows使用CR LF(这是正确的,换行符有两个字符 - 看看为什么没有人喜欢Windows?开玩笑)作为新行。

因此,来自Mac上某人的文本文件(假设它是一个现代操作系统)都会将LF作为其行尾。如果你试图在Windows上阅读它们,并且Windows期望CR LF,它将无法找到它。现在,it has already been mentioned PHP有能力为你排序这个烂摊子,但如果你愿意,这里有一个记忆占用的解决方案:

$file = file_get_contents("filename");
$array = split("/\012\015?/", $file); # won't work for Mac Classic

当然,您可以使用file()as has already been mentioned)执行相同的操作。