逐行读取文本文件php代码-无法检测到换行符

32
我有一个自己编写的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>');
    }       
}

6
请使用“Mac”,而非“MAC”。 - Chris Lutz
4个回答

32

1
它默认为关闭状态,所以他可能不知道它。 - Chris Lutz
如果您无法访问php.ini文件怎么办?我不确定是否能够修改它(在此期间我会调查一下)。 - TaRDy
只需使用ini_set在运行时设置此选项。 - empi
谢谢大家,我对PHP比较新,不知道ini_set函数。 - TaRDy
我从来不知道有这样的设置,总是直接使用fgets,而且一直都能正常工作。感谢您指出这一点。 - Veeru
对我不起作用。Godaddy是主机;文件来自Mac。在运行时设置;回车符未正确解析。 - Bret Weinraub

11

file()有什么问题?

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

3
没有加上ini_set('auto_detect_line_endings',true);似乎没有帮助解决这个问题。 - TaRDy
2
需要注意的是,file() 函数会将整个文件读入一个数组中,更确切地说,是读入内存中。虽然这种方法肯定可行,但在处理大文件时不建议使用。 - newfurniturey

6
fgets的man页面中获知:
请注意:如果PHP在读取来自Macintosh计算机创建或处理的文件时无法正确识别行结束符,启用auto_detect_line_endings运行时配置选项可能有助于解决该问题。
此外,您尝试过file函数吗?它返回一个数组; 数组中的每个元素对应文件中的一行。
编辑:如果您无法访问php.ini,则使用哪个Web服务器?在Apache中,您可以使用.htaccess文件更改PHP设置。还有ini_set函数,允许在运行时更改设置。

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,则无法找到它。现在,已经提到 PHP具有为您解决此问题的能力,但如果您愿意,这里有一个占用内存的解决方案:

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

当然,您也可以使用file()做同样的事情(如已经提到的)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接