【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
No.3
- 回答日時:
たとえばcrlfがでてくるまで読み続けるとか・・・
$txt=fgets($fp,1024);
while(feof($fp)===false && substr($txt,-2)!=="\r\n") $txt.=fgets($fp,1024);
#2さんのようにstream_get_line()でやるならデリミタがはずれてしまうので
必要があればあとでデリミタ分を付加してやる必要があるでしょう。
ご回答ありがとうございます。
地道に読んでいく方法も一瞬考えましたが、
もっと簡単にできる方法があるのかどうか、
質問してみました。
No.2ベストアンサー
- 回答日時:
#実装の方法自体はそんなに難しくないけど、多分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
ご回答ありがとうございます。
恥ずかしながら「stream_get_line」というのを知りませんでした。
これは使えそうです。
No.1
- 回答日時:
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」は無視して欲しい、
というのが質問の主旨です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) 改行コードについて 4 2022/08/13 14:20
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
- PostgreSQL 画像とカテゴリーを出力したいのですが、取得の条件を付ける方法がわかりません。 2 2022/05/01 18:03
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- PHP 文字列を段落で分ける方法を教えて下さい。 2 2023/03/09 10:03
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP PHP MySql ページング 2 2022/09/20 06:38
- PHP eclipse pleiades phpのインストールについて 1 2023/02/03 17:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAのコマンドボタンの文字列の...
-
ソースコードの1行が長いとき...
-
COBOLの改行
-
エスケープ文字の復帰(¥r)と...
-
C++で空Enterの入力を判...
-
改行について
-
改行コードが半角スペースにな...
-
【VBA】エクセルで最後の不要な...
-
Excel VBAからBeckyを起動して...
-
delphi でのコード上でTab を入...
-
コンボボックスの項目中に改行を
-
タグの中の改行文字を正規表現...
-
jsp 改行コードで改行させて表...
-
JavaDoc コメントの改行について
-
LaTeX: captionの中で改行した...
-
キャリッジリターンとラインフ...
-
ファイルから読み取った改行文...
-
項目内改行があるCSVの書式設定...
-
文の改行
-
ifの中に改行とコメントを書い...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのコマンドボタンの文字列の...
-
ソースコードの1行が長いとき...
-
エスケープ文字の復帰(¥r)と...
-
ファイルから読み取った改行文...
-
JAVA System.out.println の ...
-
C++で空Enterの入力を判...
-
COBOLの改行
-
テキストファイルから改行コー...
-
改行について
-
【VBA】エクセルで最後の不要な...
-
1行ごとに取得して、その改行...
-
jsp 改行コードで改行させて表...
-
VBAでCSVをExcelに取り込む時に...
-
エクセルVBA 文字列領域が不足...
-
最終行の改行について
-
改行を読み飛ばす
-
コンボボックスの項目中に改行を
-
ExcelVBAでメールを作成してメ...
-
テキストボックス行の桁数を制...
-
JavaMail,本文中の改行について
おすすめ情報