某个txt文件仅包含CRLF换行符。已通过在Notepad ++中打开文件并启用“显示所有字符”来确认。
使用PHP读取文件时,使用file_get_contents()或fopen(),CR字符似乎被过滤掉了:
<?php
...
$fh = fopen($path, 'r');
while (!feof($fh)) {
$string .= fread($fh, 1024);
}
preg_match_all('/\r/', $string, $matches);
var_dump($matches);
// 0 matches: array(1) { [0]=> array(0) { } }
$string2 = file_get_contents($path);
preg_match_all('/\r/', $string2, $matches2);
var_dump($matches2);
// 0 matches: array(1) { [0]=> array(0) { } }
?>
我很困惑,因为每个提到的函数的文档都没有说明这一点。也许有其他方法可以准确地打开文件。
需要确认这些函数是否过滤掉或“标准化”CR字符。是这样,这些功能还可以“正常化”吗?有没有办法避免这种行为?
为了更明确,我需要这些CR字符,并且在将文件加载到变量中时,每个位都保持不变。
谢谢
答案 0 :(得分:0)
试试这个解决方案:
preg_match_all('/'.PHP_EOL.'/', $string, $matches);
PHP_EOL 是跨平台方式的换行符,因此它处理Windows / Mac / Unix。
同时检查documentation此常量。
答案 1 :(得分:0)
是的, fopen 的功能取决于您提供的参数,您可以在文档中找到它:http://php.net/manual/en/function.fopen.php
Windows提供了一个文本模式转换标志('t') 在处理文件时透明地将\ n转换为\ r \ n。在 相比之下,您也可以使用'b'来强制二进制模式,而不是 翻译您的数据。要使用这些标志,请指定“b”或“t” 模式参数的最后一个字符。
即。你可以通过在模式参数中使用'b'标志来避免这种“翻译”。例如:
fopen($path, 'rb'); // Read in binary mode