2012-02-04 21 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

相關問題