javascript の正規表現でファイルを置き換えするプログラムを書いたんですが現在のままでは1ファイルづつしか置き換えができません。


このプログラムをフォルダ単位(複数ファイル)で使えないでしょうか?

よろしくお願いします。m(__)m

*コードをいただければ最高ですが、
参考になるページでも教えていただければ助かります。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/06/16 13:43:30
  • 終了:2011/06/17 23:28:56

ベストアンサー

id:Cherenkov No.3

Cherenkov回答回数1502ベストアンサー獲得回数4922011/06/16 19:30:04

ポイント400pt

WSHで書いてみました。ドラッグアンドドロップで直接ファイルの中身を書き換えます。

使い方は、

  1. replace.wsfのstrSet変数に[ [/置換前の正規表現/, '置換後の文字列'], [/置換前の正規表現/, '置換後の文字列'] ]のように複数の条件を書く。
  2. 置換したいファイルをreplace.wsfにドラッグアンドドロップする。

注意点

  • replace.wsfと置換したいファイルはShift_JISであること。UTF-8では文字化けする。(今回はモバイル向けでShift_JISなのでちょうどいい。replace.wsfはencoding="UTF-8"に変えてUTF-8で保存してもいい。出力をUTF-8にするにはADODB.Streamを使えばいいらしい。)

replace.wsfで保存。

<?xml version="1.0" encoding="Shift_JIS" standalone="yes" ?>
<package>
<job id="WordReplace">
<?job error="True" debug="True" ?>
<object id="objFs" progid="Scripting.FileSystemObject" />
<script language="JavaScript">
<![CDATA[
var strSet = [
  [/<!DOCTYPE HTML PUBLIC "-\/\/W3C\/\/DTD HTML 4\.01 Transitional\/\/EN\">[\s\S]*?<title>パソコン用/g, '<!DOCTYPE HTML PUBLIC "-//W3C//DTD Compact HTML 1.0 Draft//EN">\n<html>\n<head>\n<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">\n<meta name="Keywords" content="テスト">\n<title>モバイル用'],
  [/<div class="line1"><img src="\.\.\/\.\.\/image2\/hana2\.gif" alt="花" width="20" height="20\"><\/div>/g, '<hr size=1 width=100% align=center noshade color=#ff1493>']
];

var objArg=WScript.Arguments;
for(var i = 0; i < objArg.length; i++) {
  var strTmp = objFs.BuildPath (objFs.GetParentFolderName (WScript.ScriptFullName), objFs.GetTempName ());
  var objTs = objFs.OpenTextFile(objArg(i),1,false);
  var objTs2 = objFs.OpenTextFile(strTmp,2,true);
  do {
    var strLne = objTs.ReadLine();
    for (var j = 0; j<strSet.length; j++) {
      strLne = strLne.replace(strSet[j][0], strSet[j][1]);
    }
    objTs2.WriteLine(strLne);
  } while (!objTs.AtEndOfStream);
  objTs.Close();
  objTs2.Close();
  objFs.DeleteFile(objArg(i));
  objFs.MoveFile(strTmp,objArg(i));
}
]]>
</script>
</job>
</package>

テスト用ファイルをtest.htmlで保存。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">abc<title>パソコン用
<div class="line1"><img src="../../image2/hana2.gif" alt="花" width="20" height="20"></div>


結果:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD Compact HTML 1.0 Draft//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta name="Keywords" content="テスト">
<title>モバイル用
<hr size=1 width=100% align=center noshade color=#ff1493>

参考:

@IT:Windows TIPS -- Tips:複数ファイルの文字列置換をワンクリックで行なう

id:tontonpokopoko

わざわざコードを書いていただきありがとうございます。

ただ拡張子をwsfにしてドラッグアンドドロップすると

「定義されているジョブがありません」

と私の環境(win vista)だとなってしまうのですが・・

2011/06/16 22:18:31

その他の回答(2件)

id:Cherenkov No.1

Cherenkov回答回数1502ベストアンサー獲得回数4922011/06/16 16:59:25

Grep and Replace(一括置換) の使い方

このソフトは試されましたか?

id:tontonpokopoko

利用したことあると思います。現在は、ez-html を使っているのでフォルダ内の一括置き換えもできます。ただ望んでいるモバイルソースにするために、10回くらい置き換えを繰り返さないといけないんです。(ヘッダー部分、サイド部分、降った部分・・・)

もっと簡略化したいんですが、自力じゃこのあたりまでで・・。

2011/06/16 17:24:45
id:TinqWill No.2

TinqWill回答回数71ベストアンサー獲得回数112011/06/16 18:19:54

ポイント100pt

同時に複数条件を指定して置き換えを行えるソフト、ということで探したら、それらしきソフトが見つかりました。正規表現の使用も可能なようです。

http://www.sirmiles.com/

ご希望に沿わなかったら申し訳ありません。

id:tontonpokopoko

コメントをありがとうございます。

このソフトでほぼ望んでいた動作ができました。

ばっちりです!

2011/06/17 23:30:51
id:Cherenkov No.3

Cherenkov回答回数1502ベストアンサー獲得回数4922011/06/16 19:30:04ここでベストアンサー

ポイント400pt

WSHで書いてみました。ドラッグアンドドロップで直接ファイルの中身を書き換えます。

使い方は、

  1. replace.wsfのstrSet変数に[ [/置換前の正規表現/, '置換後の文字列'], [/置換前の正規表現/, '置換後の文字列'] ]のように複数の条件を書く。
  2. 置換したいファイルをreplace.wsfにドラッグアンドドロップする。

注意点

  • replace.wsfと置換したいファイルはShift_JISであること。UTF-8では文字化けする。(今回はモバイル向けでShift_JISなのでちょうどいい。replace.wsfはencoding="UTF-8"に変えてUTF-8で保存してもいい。出力をUTF-8にするにはADODB.Streamを使えばいいらしい。)

replace.wsfで保存。

<?xml version="1.0" encoding="Shift_JIS" standalone="yes" ?>
<package>
<job id="WordReplace">
<?job error="True" debug="True" ?>
<object id="objFs" progid="Scripting.FileSystemObject" />
<script language="JavaScript">
<![CDATA[
var strSet = [
  [/<!DOCTYPE HTML PUBLIC "-\/\/W3C\/\/DTD HTML 4\.01 Transitional\/\/EN\">[\s\S]*?<title>パソコン用/g, '<!DOCTYPE HTML PUBLIC "-//W3C//DTD Compact HTML 1.0 Draft//EN">\n<html>\n<head>\n<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">\n<meta name="Keywords" content="テスト">\n<title>モバイル用'],
  [/<div class="line1"><img src="\.\.\/\.\.\/image2\/hana2\.gif" alt="花" width="20" height="20\"><\/div>/g, '<hr size=1 width=100% align=center noshade color=#ff1493>']
];

var objArg=WScript.Arguments;
for(var i = 0; i < objArg.length; i++) {
  var strTmp = objFs.BuildPath (objFs.GetParentFolderName (WScript.ScriptFullName), objFs.GetTempName ());
  var objTs = objFs.OpenTextFile(objArg(i),1,false);
  var objTs2 = objFs.OpenTextFile(strTmp,2,true);
  do {
    var strLne = objTs.ReadLine();
    for (var j = 0; j<strSet.length; j++) {
      strLne = strLne.replace(strSet[j][0], strSet[j][1]);
    }
    objTs2.WriteLine(strLne);
  } while (!objTs.AtEndOfStream);
  objTs.Close();
  objTs2.Close();
  objFs.DeleteFile(objArg(i));
  objFs.MoveFile(strTmp,objArg(i));
}
]]>
</script>
</job>
</package>

テスト用ファイルをtest.htmlで保存。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">abc<title>パソコン用
<div class="line1"><img src="../../image2/hana2.gif" alt="花" width="20" height="20"></div>


結果:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD Compact HTML 1.0 Draft//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta name="Keywords" content="テスト">
<title>モバイル用
<hr size=1 width=100% align=center noshade color=#ff1493>

参考:

@IT:Windows TIPS -- Tips:複数ファイルの文字列置換をワンクリックで行なう

id:tontonpokopoko

わざわざコードを書いていただきありがとうございます。

ただ拡張子をwsfにしてドラッグアンドドロップすると

「定義されているジョブがありません」

と私の環境(win vista)だとなってしまうのですが・・

2011/06/16 22:18:31
  • id:Cherenkov
    具体的にどういう方法でやろうとしているのですか?
    "現在"の方法を教えてください。
    JScript?node.js?
  • id:tontonpokopoko
    現在はローカル環境で、html内のフォームにtextareaを2つ作って変換しています。

    javascript でできれば1番いいです、それ以外の知識はほとんどないので。柔軟性(置き換えの条件をこちらで設定できる)のきくフリーソフトかなんかがあればそれでも嬉しいのですが。
  • id:tontonpokopoko
    コメントをありがとうございます。
    レイアウトを大幅に変える置き換えなので、普通のフリーソフトの設定ではできないと思いますが・・
  • id:Cherenkov
    「ファイルを置き換えするプログラム」の意味がよくわからないのと、
    javascriptといってもいくつか方法があるので、現在のコードを教えてください。
  • id:tontonpokopoko
    質問が悪くて申し訳ありません。
    以下の感じでPCのソースをモバイル用に一括で置き換えるものを作りました。
    今度はこれをフォルダ単位で一括変換したいのです。

    function func() {
    var TargetString = document.ttt.aaa.value;

    TargetString=TargetString.replace(/<div class=\"choco\">[\s\S]*?<\/div>/g,"");

    TargetString=TargetString.replace(/<div class=\"line1\"><img src=\"..\/..\/image2\/hana2\.gif\" alt=\"花\" width=\"20\" height=\"20\"><\/div>/g,"<hr size=1 width=100% align=center noshade color=#ff1493>");

    TargetString=TargetString.replace(/<!DOCTYPE HTML PUBLIC \"-\/\/W3C\/\/DTD HTML 4.01 Transitional\/\/EN\">[\s\S]*?<title>パソコン用/g,"<!DOCTYPE HTML PUBLIC \"-\/\/W3C\/\/DTD Compact HTML 1\.0 Draft\/\/EN\">\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\">\n<meta name=\"Keywords\" content=\"テスト\">\n<title>モバイル用");

    ・・・
    }

    <form name="ttt">
    <input type="button" value="OK" onclick="func()"><br>
    <textarea name="aaa" cols="100" rows="25"></textarea><br>
    <textarea name="bbb" cols="100" rows="25"></textarea><br>
    </form>規約違反として通知
  • id:Cherenkov
    今までのプログラムは、ファイルというよりも、textareaの文字列を単純に置換してtextareaに表示するプログラムですかね。
    どういう操作で置換したいのでしょうか?
    例えば、textarea1に置換前、textarea2に置換後を入力して、置換ボタンで実行保存とか。
  • id:tontonpokopoko
    コメントをありがとうございます、そのとおりです。
  • id:Cherenkov
    一度に複数の条件を置換させないとez-htmlの置換機能を超えることができないですよね?
    そのあたりの要望をしっかりと提示するべきでは?
  • id:Cherenkov
    うーん、やり直してもだめですか?
    replace.wsfは回答のコードを正しくコピペできていますか?
    エラーメッセージを詳細に教えてください。
  • id:Cherenkov
    コマンドプロンプトで
    replace.wsf test.html
    のようにするとどうですか。
    (プロンプトでreplace.wsfの場所まで移動してから実行)
  • id:tontonpokopoko
    コメントをありがとうございます。
    コマンドプロンプトだと、
    内部コマンド、または外部コマンド、
    操作可能なプログラム、またはバッチ、ファイルとして認識されてません。
    と出ます。

    wsfについて詳しくないので初歩的なミスがあると思います。
  • id:Cherenkov
    >内部コマンド、または外部コマンド
    はプロンプトがwsfのある場所に移動(cdコマンドで)できてないようですね…。
    まあこれは置いておいて、
    回答No.3をやり直しても「定義されているジョブがありません」でしょうか。
    詳細なエラーメッセージを教えてください。
    エラーがでるなら、Windows Based Script Hostに関連付けされていてD&Dでうまくいくはずですが。

    念のため回答3の手順を示しますと、
    <?xml version=の行から</package>の行までをコピーして、エディタに貼り付けて、replace.wsfで保存します。
    次にテスト用のtest.htmlを保存します。
    replace.wsfとtest.htmlは文字コードがShift_JISで保存されていないと正しく処理されません。
    ここで、replace.wsfに問題が無ければ、replace.wsfをダブルクリックして実行してもエラーは出ません。(何も処理されないだけ)

    テスト方法はtest.htmlをreplace.wsfにドラッグアンドドロップして、
    test.htmlをエディタで開いて結果を確認します。
    エラーがでたら詳細に書いてください。
  • id:tontonpokopoko
    ありがとうございます。
    最初に「定義されているジョブがありません」と出ましたが、
    現在はD&Dしても何も起こりません。
    replace.wsfをダブルクリックしても何も起こりません。
  • id:tontonpokopoko
    あ、いろいろ繰り返してたらできました!
  • id:Cherenkov
    それはよかったです。
    あとはhtmlの文字コードに気をつけて、
    目的の正規表現を正しく入力することですね。
  • id:tontonpokopoko
    原因はわかりませんが何かの単純なミスだったと思います。
    親切にお付き合いくださり本当に助かりました。

    もし複数ファイルの置き換えを一括でする場合、
    複数ファイルをD&Dするのでしょうか?

    フォルダごとD&Dしてみたら「書き込みができません」というエラーがでます。


  • id:Cherenkov
    フォルダごとにはおそらく対応していません。
    複数のファイルをD&Dしてお使いください。
    ファイルを選択する際にCtrlキーを押しながらクリックすれば、選択しやすくなります。

    今回はGUI(textarea等)による操作ではありませんが、
    こちらを参考にして応用すればそれも可能だと思います。
    (IE8はcharsetを指定しないと真っ白になるので注意)
    http://itpro.nikkeibp.co.jp/article/COLUMN/20060731/244742/
  • id:tontonpokopoko
    いろいろとありがとうございました。
    もう一人の方に教えていただきたソフトでほぼ望んだ動作をしたのですが、
    自分で勉強すれば柔軟性が出てくるので少しずつスキルを上げたいと思います。

    これれで解決とさせていただきます。
    また機会があればよろしくお願いいたしますm(_)m

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません