スレッド表示 | フラット表示〕 全トピック 920 件中 131 番目 次≫ ≪前

テキストファイルの置換について

created: 2007-03-06 02:29 | modified: 2007-03-07 00:12 | reply: 4

[3636] テキストファイルの置換について

user: トマホーク | created: 2007-03-06 02:29
初めまして、こんばんは。  トマホークと申します。
どうしても解らないところがあるので、こちらで質問しても
よろしいですか?

質問内容:いまテキストを読み込んで、特定の文字を置換する処理を考えているのですが、以下のコードでは上手く置換されません。
※置換される行と置換されない行がそれぞれ出力されて
しまう。5行のファイルがあれば、10行出力されてしまう

知識不足な為、他の方法が思いつかないのですが…
この考え方は根本的に間違っているのでしょうか?

みなさんにご教授頂ければ幸いです。よろしくお願いします

<?php
DEFINE(F_NAME, "text/read.txt");


if(file_exists(F_NAME))
{
$file = fopen(F_NAME, "r");
flock($file, LOCK_EX);

while(!feof($file))
{
$string = fgets($file);
echo $string."<br>";
}
flock($file, LOCK_UN);
fclose($file);
} else
{
exit();
}
echo "<br>";

if(file_exists(F_NAME))
{
$file = fopen(F_NAME, "r");
flock($file, LOCK_EX);
while(!feof($file))
{
$string = fgets($file);
echo str_replace("ぼく", "僕", $string)."<br>";
echo str_replace("わたし", "私", $string."<br>");
}
echo "<br><br>";
flock($file, LOCK_UN);
fclose($file);
} else
{
exit();
}
?>
reply: 3637 返信 編集 削除

[3637] Re.テキストファイルの置換について

user: Pluto | created: 2007-03-06 08:54
Whileループ中、置換処理後すぐechoで画面表示するスクリプトになっていますね。
ループ中に複数回置換を行う際は、変数に代入する方法を取った方がいいですよ。

ex)
while(!feof($file))
{
$string = fgets($file);
$dat = str_replace("ぼく", "僕", $string);
$dat = str_replace("わたし", "私", $dat);
echo $dat . "<br>";
}
Parent: 3636  reply: 3638 3639 返信 編集 削除

[3638] mixedに注目

user: ach | created: 2007-03-06 22:16
プログラムが複雑化すると結局Plutoさんのコードのようなことをしなくてはならないですが,まあTipってことで.

マニュアルを読むとかいてありますが,str_replaceやpreg_replace(なせかereg_replaceはできない)は複数の置換を一度に行うことができます.
つまりこの場合だと
while ($string = fgets($file)) 
echo str_replace(array("ぼく", "わたし"), array("僕", "私"), $string);
でOK.

トマホークさんのコードを見てふと思ったのですが,ループの判定にはfeofを使うべきなのか,それともperlやCよろしくfgetsがEOF(false)返す事を利用すべきなのでしょうか?
Parent: 3637  reply: 3640 返信 編集 削除

[3640] Re.テキストファイルの置換について

user: トマホーク | created: 2007-03-07 00:12
こんばんわ、achさん。
親切に教えていただきありがとうございます。
マニュアルを調べるのを怠っていました…すいません。

	$before = array(~置換前の文字列~);
$after = array(~置換後の文字列);

while($string = fgets($file))
{
$buff = str_replace($before, $after, $string)."<br>";
echo $buff;
}
このように記述する事で希望通りの処理を行う事が出来ました。


>ループの判定にはfeofを使うべきなのか…
という事ですが、CもPerlも学んだ事が無く、ネットでPHPを手当たり次第学習してる身なので
while ($string = fgets($file)) と

while(!feof($file))
$string = fgets($file);
の違いや用途については詳しく解らない状態です。
ネットでファイルを終端まで一行ずつ読み込む処理を
while(!feof($file))
$string = fgets($file);
みかけたので、使用しました。
Parent: 3638  返信 編集 削除

[3639] Re.テキストファイルの置換について

user: トマホーク | created: 2007-03-06 23:58
こんばんわ、Plutoさん。

このように記述すれば良かったんですね…
全然気付かなかったです。

ご指摘ありがとうございました。
Parent: 3637  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 131 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑