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

其他提示

file() 出了什么问题?

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

来自 fgets 的手册页:

  

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

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

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

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

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()做同样的事情(已经提到过

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top