2012-02-04 50 views
1
while($c=fgets(STDIN)){ 
    if($c===PHP_EOL){ 
     continue; 
    } 
    else { 
     echo $c; 
    } 
} 

当上述代码在php 5.3.8的命令行中调用时,它会在输入文件中打印行并跳过所有空行。但是,在PHP 5.2.6中,它不会跳过空行。PHP版本会导致跳过同一代码行的不同行为

是否有任何改变代码的方法,让它跳过lder版本中的空行?

+0

你肯定'PHP_EOL'是在两个环境中相同,它有问题的文件'EOL'字符相匹配? – prodigitalson 2012-02-04 18:53:44

+0

我以为PHP_EOL是一个预定义的常量,因此应该可以在任何系统上工作,请看这里:http://us2.php.net/manual/en/reserved.constants.php – 2012-02-04 22:09:57

+0

它是预定义的,但它映射到平台EOL。所以如果你在平台之间切换,并且你正在阅读的文件是在不同的平台上创建的,那么'EOL'可能不匹配。 – prodigitalson 2012-02-04 22:14:54

回答

1

如果更改条件

if(ord($c[0])==0x0a || ord($c[0])==0x0d) 

这应该在任何平台上运行。

ord

+0

谢谢!这工作。你可以给我一个链接到文档,但?我想更好地理解它 – 2012-02-04 21:55:46

+0

哦,我现在看到,这是ascii,真棒,tnx – 2012-02-04 21:57:24

+0

此字符串在不同的服务器上给出不同的输出......帮助!(ord($ str [7])<< 24)|(ord($ str [8])<< 16)|(ord($ str [9])<< 8)|( ord($ str [10])))/ 1000000;' 如果它是一个负数,我得到类似于4042而不是-0.05的东西。 – kouton 2012-12-31 08:32:24

0
$c = str_replace("\r\n", "", $c); 

P.S.我不认为这个PHP版本是重要的。这看起来像是配置有问题。

+0

谢谢,我认为可能有配置问题,也有一个PHP警告,我会问我的主机提供商。 – 2012-02-04 18:58:10

0

如果您不需要尾随空格,你可以使用:

$c = rtrim($c, "\n\r"); 
if($c == ''){ 
    continue; 
} 

如果你这样做,你应该检查字符串长度或使用本:

if(($c{0} == "\n") || ($c{0} == "\r")){ 
    continue; 
} 
+0

在第一个例子中,使用'if($ c =='')'而不是'if(empty($ c))''来推荐。 “0”可能是有效的输入。 – 2012-02-04 18:54:42

+0

@Phoenix'fgets'字符串包含'\ n'和因此,当你的字符串以'\ n'或'\ r'开始时,它只包含换行符。 – Vyktor 2012-02-04 18:56:29

+0

这是真的,但假设用户输入序列'0 \ n'。通过'rtrim()'运行后,'$ c'现在包含字符串“0”,这会导致'empty($ c)'返回'true',这可能不会导致此应用程序的正确行为。 – 2012-02-04 20:10:21

2

的差异可能是由引起php.ini更改,而不是版本。在你的php配置文件中检查auto_detect_line_endings键或者如果你有访问尝试;

<?php 
    ini_set("auto_detect_line_endings", true); 
?> 

auto_detect_line_endingsfgets使用。 PHP_EOL总是会根据操作系统得到正确的行尾字符,但如果您没有将auto_detect_line_endings设置为true,则fgets可能会失败。

+0

好吧,我刚刚尝试过。在php.ini中,它被设置为“关”。我改为“开”,它仍然没有工作.. – 2012-02-04 21:52:34

相关问题