プロが教える店舗&オフィスのセキュリティ対策術

質問させて下さい。

共有サーバーで複数のドメインを管理・運営しており、各ドメインのindex.htmlの内容を書換えたいと考えております。

サーバーのディレクトリ構造はこんな感じ。
public_html
 |
 |- sample1.com(フォルダ)
 |     |
 |     + index.html(Shint_JIS)
 |
 |- sample2.com(フォルダ)
 |     |
 |     + index.html(Shint_JIS)
 |
 |- sample3.com(フォルダ)
 |     |
 |     + index.html(Shint_JIS)
 |
 |- sample4.com(フォルダ)
 |    |
 |    + index.html(Shint_JIS)
 |
 +-un_txt.php(実行ファイル EUC-JP)


この上記構成にある、un_txt.phpというファイルにアクセスすることで、各フォルダ内にあるindex.html内の内容を書換えたいと思っているのですが、PHPはEUCで指定しており、書換えたい各htmlファイルはShift_JISとなっているためか、実行すると文字化けが発生してしまいます。

以下は現時点てのスクリプト、そのままですが、どこがおかしいのかご指摘頂くことは可能でしょうか?

<?php

$text_data = array("ホームページ", "アイフォン", "スマートフォン");


$array = scandir("./");
mb_convert_variables("EUC-JP", "SJIS", $array);

for($i=0; $i<count($array); $i++){

$name = trim($array[$i]);

$dir_name = "./".$name;

$html = "./".$name."/index.html";


if(is_readable($html)){


@chmod($html, 0606);

$addstr = file_get_contents($html);
$fp=@fopen("$html","r");

$no = '';
if($fp){
$main = "";
while (!feof($fp)){
$no++;
$main .= fgets($fp,1000);
}
}


for($m=0; $m<count($text_data); $m++){

$txt = $text_data[$m];
$no_txt = " ";

//$text_data配列に登録されているキーワードを削除。
//削除出来ないため、$no_txt では半角スペースを与えている。
$main = strtr($main, $txt, $no_txt);

}


$main = mb_convert_encoding($main,"SJIS","EUC-JP");


$fp=fopen($html, "w");
fputs($fp,$main);
fclose($fp);

}

}

以上、お忙しい中恐縮ですが、お知恵を頂戴出来れば幸いです。
宜しくお願い申し上げます。

A 回答 (1件)

>$main = mb_convert_encoding($main,"SJIS","EUC-JP");



EUC-JPからSJISにして書き込もうとされているようですが、そもそも(SJISのファイルを読んでから)EUC-JPにしてもいないのに戻すというのが謎です。またfile_get_contentsで読んだまま$addstrを放置しているのもちょっと意図がわかりませんし、こういう置換の用途にはstrtrは使いにくいのではとも思います(マニュアルでどういう関数なのかを確認すれば、まず使わないと思うのですが。

http://jp.php.net/manual/ja/function.strtr.php
>from と to の長さが異なる場合、長い方の余分な文字は無視されます。 返される文字列の長さは、もとの str と同じになります。



マルチバイト関数を使っていないのであれば、先に$text_dataをSJISにしてしまってもいいように思います。

<?php
$text_data = array("ホームページ", "アイフォン", "スマートフォン");
mb_convert_variables('SJIS', 'EUC-JP', $text_data);
$array = glob('*', GLOB_ONLYDIR);
foreach ($array as $dir) {
$file = $dir . "/index.html";
if (!is_readable($file)) { die('not readable ' . $file); }
if (!is_writable($file)) { die('not writable ' . $file); }
$source = file_get_contents($file) or die('cannot read ' . $file);
foreach ($text_data as $text) { $source = str_replace($text, '', $source); }
file_put_contents($file, $source) or die('cannot write ' . $file);
}
    • good
    • 0
この回答へのお礼

shimix様

ご親切なアドバイスをありがとうございます。
また的確なご指摘をありがとうございます。

このソースですが他のソースからの流用だったため、file_get_contentsなど一部が残ったままとなっていました。

質問投稿後、見直すことで文字化けも直っておりましたが、shimix様のスマートなソースを参考に勉強させて頂こうと思います。

この度はご親切なアドバイスをありがとうございました。

お礼日時:2012/10/05 00:43

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