アプリ版:「スタンプのみでお礼する」機能のリリースについて

【PHP】fgetsした際に「CR/LF」だけを改行と認識したい。


 fgetsで1レコードを読んだ際に、現在は「CR/LF」および「LF」が改行として認識されています。
 これを「CR/LF」のみ改行という認識に改めたいのですが、php.iniの設定で行えるのでしょうか。

 もしくは、別の方法で実現出来るのでしょうか。

 ご存知の方がいらっしゃいましたら、ご回答頂けると幸いです。


【環境】
・PHP Version 5.2.5
・サーバ WindowsServer2003 + IIS
・文字コード PHP=S-JIS ブラウザ=S-JIS

【php.iniの主な設定】
output_buffering = off
default_charset = Shift_JIS
extension = php_mbstring.dll

mbstring.language = Japanese
mbstring.internal_encoding = SJIS
mbstring.http_input = auto
mbstring.http_output = SJIS
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character =none

A 回答 (3件)

たとえばcrlfがでてくるまで読み続けるとか・・・



$txt=fgets($fp,1024);
while(feof($fp)===false && substr($txt,-2)!=="\r\n") $txt.=fgets($fp,1024);

#2さんのようにstream_get_line()でやるならデリミタがはずれてしまうので
必要があればあとでデリミタ分を付加してやる必要があるでしょう。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

地道に読んでいく方法も一瞬考えましたが、
もっと簡単にできる方法があるのかどうか、
質問してみました。

お礼日時:2010/05/14 09:48

#実装の方法自体はそんなに難しくないけど、多分yambejpさんは実装の意図を聞きたいんだろうなぁ…



慣れているC#でファイルを作り、

using System;



namespace Q5892130

{

class MainClass

{

public static void Main (string[] args)

{

System.IO.FileStream fs = new System.IO.FileStream("C:\\Environment\\Users\\WWW\\OKWave\\Q5892130\\aaa.txt",System.IO.FileMode.Create);

byte[] bs = new byte[]{0x61,0x0A,0x62,0x0D,0x0A,0x61,0x62};

fs.Write(bs,0,bs.Length);

fs.Flush();

fs.Close();

System.Console.WriteLine("done!");

}

}

}

PHPでこのファイルを読み取ってみました。

<?php
$fp = fopen('aaa.txt', 'r', false);
print(rawurlencode(stream_get_line ( $fp , 2000 , "\r\n" )));
fclose($fp);
print("\n");
?>

結果:

a%0Ab
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

恥ずかしながら「stream_get_line」というのを知りませんでした。
これは使えそうです。

お礼日時:2010/05/14 09:47

rgetsはバイナリセーフですから、「CR/LF」は「CR/LF」、「LF」は「LF」と認識されます。


「改行」というあいまいな定義では回答のしようがありません。
どういう「改行」を処理したいのでしょうか?

たとえば
<?

$fp=fopen("test.txt","r");
$txt="";
while(feof($fp)===false){
$txt.=fgets($fp,1024);
}
fclose($fp);
print strlen($txt);
?>
としてみてtext.txtの改行マークを「CR/LF」と「LF」比較するとサイズが異なります。

「CR/LF」をたんに<br>にするだけなら

<?
$fp=fopen("test.txt","r");
$txt="";
while(feof($fp)===false){
$txt.=fgets($fp,1024);
}
fclose($fp);
print str_replace("\r\n","<br>",$txt);
?>

というロジックもあるかと思いますが、LFを改行と認識しないという選択肢は
普通はありえません

この回答への補足

ご回答ありがとうございます。

補足します。

ファイルを1レコードずつ読み出して処理をします。
レコードの末尾には「CR/LF」が付与されているのですが、
レコードの途中に「0x0A(LF)」が存在する場合があります。

現在、fgetsを行うと、レコード末尾の「CR/LF」までを1レコードと
する場合と、途中にある「LF」までを1レコードとする場合が
生じています。(つまりレコード途中で切られている)
これを前者に統一したい、途中にある「LF」は無視して欲しい、
というのが質問の主旨です。

補足日時:2010/05/13 17:53
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!