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

TaR*_*RDy 33 php newline text-editor

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

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

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

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

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

ini_set('auto_detect_line_endings',true);
Run Code Online (Sandbox Code Playgroud)

功能:

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>');
    }       
}
Run Code Online (Sandbox Code Playgroud)

jmu*_*llo 11

怎么了file()

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

  • 没有添加ini_set('auto_detect_line_endings',true); 这似乎没有帮助这个问题. (3认同)
  • 还应该注意的是,`file()` 将整个文件读入一个数组,或者更具体地说,读入内存。这个解决方案虽然确实有效,但在处理大文件时是不明智的。 (2认同)

Aym*_*ieh 6

fgets的手册页:

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

还有,你试过文件功能吗?它返回一个数组; 数组中的每个元素对应于文件中的一行.

编辑:如果您无法访问php.ini,您使用的是哪个Web服务器?在Apache中,您可以使用.htaccess文件更改PHP设置.还有ini_set函数允许在运行时更改设置.


Chr*_*utz 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
Run Code Online (Sandbox Code Playgroud)

当然,你可以做同样的事情file()(正如已经提到的那样).