テキスト置換プログラミングの作成方法

このQ&Aのポイント
  • テキスト置換プログラミングを作成しようとしていますが、上手くいかず困っています。入力したテキストを置換するプログラムを作成するために、テキストエリアに文章を入力し、置換前の文字と置換後の文字を入力する形にしました。しかし、置換前の文字が正しく置換されず、削除される問題が発生しています。
  • プログラムでは、POSTメソッドによるフォームの入力データを受け取り、入力された置換前の文字と置換後の文字を取得しています。そして、入力された文章の中から置換前の文字を検索し、一致する部分を置換後の文字に変換しています。しかし、現在のプログラムではうまく動作していないようです。
  • もし間違いがあれば教えていただきたいです。また、複数の置換を一度に行いたい場合にどのようなプログラムの変更が必要かも教えていただけると助かります。
回答を見る
  • ベストアンサー

入力したテキストを置換するプログラミングを作りたいのですが上手くいかず

入力したテキストを置換するプログラミングを作りたいのですが上手くいかず困っています。 テキストエリアに文章を入力し、 次に置換前の文字と置換後の文字をそれぞれ入力する形にして置換をしようと考えています。 最終的に置換前の文字と置換後の文字を入力する欄を複数用意して 複数の置換を一度で行ないたいと思っています。 ですが下記の「a1」に入力した置換前の文字全て削除され「a2」の内容に変換されません。 初心者なので根本的に間違ってるかもしれませんが、わかる方よければ教えてください。 ----------------- <form method="post" action="form.cgi"> <textarea name="chikan" rows="10" cols="70"></textarea><br> <input type="text" name="a1" size="50">を<input type="text" name="a2" size="50">に変換<br><br> </p> <p><input type="submit" value="置換"></p> </form> ----------------- ----------------- #!/usr/local/bin/perl if ($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $alldata, $ENV{'CONTENT_LENGTH'}); } else { $alldata = $ENV{'QUERY_STRING'}; } foreach $data (split(/&/, $alldata)) { ($key, $value) = split(/=/, $data); $value =~ s/\+/ /g; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1))/eg; $value =~ s/\t//g; $value =~ s/\n//; $in{"$key"} = $value; $in{'chikan'} =~ s/\Q$in{'a1'}\E/$in{'a2'}/g; } print"Content-type: text/html\n\n"; print <<"EOM"; <html> <head><title></title> </head> <body> <textarea name=area rows=50 cols=70> $in{'chikan'} </textarea> </form> </body> </html> EOM exit; -------------------------

  • dekoi
  • お礼率40% (2/5)
  • CGI
  • 回答数2
  • ありがとう数6

質問者が選んだベストアンサー

  • ベストアンサー
  • luka3
  • ベストアンサー率74% (299/401)
回答No.2

かなり惜しいです。 $in{"$key"} = $value; $in{'chikan'} =~ s/\Q$in{'a1'}\E/$in{'a2'}/g; } のところを $in{"$key"} = $value; } $in{'chikan'} =~ s/\Q$in{'a1'}\E/$in{'a2'}/g; にすれば希望の動作になると思います。 foreachの中で処理をするとループ中なので何回も置換処理されます。 1回目 $in{'chikan'}=定義済 $in{'a1'}=未定義 $in{'a2'}=未定義  結果→a1が未定義のため置換対象がない 2回目 $in{'chikan'}=定義済 $in{'a1'}=定義済 $in{'a2'}=未定義  結果→a1があるがa2がないのでa1とマッチする部分が削除というのと同じになる 3回目 $in{'chikan'}=定義済 $in{'a1'}=定義済 $in{'a2'}=定義済  結果→a2が定義されたがchikanは2回目の時点で置換処理が行われたためa1とマッチする文字はすでにない という処理になっていた訳です。

dekoi
質問者

お礼

ありがとうございます。 無事に思い通りの形で動きました。 失敗の原因もわかって勉強になりました。

その他の回答 (1)

  • kuroizell
  • ベストアンサー率55% (95/170)
回答No.1

それ、前世紀の書き方だそうです。 CGIモジュール使いましょう。 #!/usr/local/bin/perl use strict; use warnings; use CGI; use CGI::Carp qw(fatalsToBrowser); my $q = CGI->new(); my $a1 = $q->param('a1'); my $a2 = $a1; $a2 =~ s/old/new/g; print <<EOF; Content-type: text/html; charset=UTF-8\n 以下略

関連するQ&A

  • textarea中の<br>⇒<br />に全置換

    <form action="略" method="post" name="foo"> (中略) <textarea name="bar" rows="4" cols="40"> </textarea> (中略) </form> 今、上記のformがあります。 で、このtextarea内の<br>を<br />に全置換するために、 <intut type="button" name="hoge" value="textare内の 「&lt;br&gt;⇒&lt;br /&gt;」を全置換" /> のようなボタンを配置したいです。 で、この<input type="button"(中略) />をおすとJSで<br>を<br />に全置換できるようにしたいのでうが、 どのようにくめばいいのでしょうか? なお、いま手許ソースがないので、name属性ではなくid属性だったかもしれません。 あるいはnameとidの両方の属性がついてたかもしれません。 どのようにくめばいいかご存じの方、よろしければそのJSの記述をお教えください。 以上、よろしくお願い申し上げます。

  • Javascriptで複数のテキストエリアの文字列を連結させたいです

    Javascriptで複数のテキストエリアの文字列を連結させたいです。 初めまして、 お世話になります。 ------------------------------------------------- <html> <head> <title>無題ドキュメント</title> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> </head> <body bgcolor="#FFFFFF" text="#000000"> <form name="form1" method="post" action=""> いつ<br> <textarea name="when"></textarea> <br> <br> どこで<br> <textarea name="where"></textarea> <br> <br> だれが<br> <textarea name="who"></textarea> <br> <br> どうした<br> <textarea name="what"></textarea> <br> <input type="submit" name="submit" value="連結"> <input type="reset" name="submit" value="リセット"> <br> <br> いつどこでだれががどうした。<br> <textarea name="textfield"></textarea> </form> </body> </html> ------------------------------------------------- というHTMLがあったとして ボタンを押したら文字列を連結させたいのです。 その際、入力したテキストフィールドで文字列が改行をされてあった場合 それをそのまま反映して表示させたいのです。 ぜひよろしくお願いします。

  • 変数の表示の仕方(改行の扱い)

    perl初心者です。よろしくお願いします。 ひとつの変数で、print関数での表示とテキストエリアでの表示を しようとしているのですが、改行の扱いに困っています。 テキストエリアで<br>を表示させないようにすると、print関数の 方の改行がなくなるし、print関数の方に改行させると、テキスト エリアで<br>が表示されるし・・・。 print関数で改行、テキストエリアでは<br>が出ずに改行という 風にしたいのですが、どなたかご教授していただけませんか? よろしくお願いします。 #!/usr/local/bin/perl use strict; #データファイル my $datafile='./data.dat'; #ライブラリの読み込み require './jcode.pl'; my $input; #フォームデータの読み込み if ($ENV{REQUEST_METHOD} eq "POST"){ read (STDIN,$input,$ENV{CONTENT_LENGTH}); }else{ $input=$ENV{QUERY_STRING}; } #フォームデータのデコード my %form = (); my @pairs = split(/&/, $input); foreach my $pair ( @pairs ){ my( $name, $value ) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; #SJISコード変換 &jcode::convert(\$value, 'sjis'); $value =~ s/\r\n/<br>/g; $value =~ s/\r/<br>/g; $value =~ s/\n/<br>/g; $form{$name} = $value; } #データのオープン open(DAT,"+<$datafile"); flock(DAT, 2); #ファイル読み込み my $line = <DAT>; for ( split /\t/ , $line ) { my( $key , $value ) = $_ =~ /^([^=]*)=(.*)$/; #フォームデータの上書き $form{$key} ||= $value; } #データの書き込みとクローズ seek(DAT,0,0); $line = ''; while (my($key,$value) = each %form) { $line .= "${key}=${value}\t"; } print DAT $line; close(DAT); &header; print $form{A}; print "<br>"; print $form{B}; print "<br>"; print $form{C}; print "<br>"; print <<EOM; <b>[内容確認]</b> <form action="new.cgi" method="POST"> <INPUT TYPE="text" SIZE="27" name="A" value="$form{A}"><br> <INPUT TYPE="text" SIZE="90" name="B" value="$form{B}"><br> <TEXTAREA name="C" ROWS="2" COLS="27">$form{C}</TEXTAREA><br> <input type="submit" value="上記内容で送信"> </form> <br> </body> </html> EOM exit; #----------------------------------------------------------------------------------- # HTMLヘッダー #----------------------------------------------------------------------------------- 割愛

    • ベストアンサー
    • Perl
  • 入力フォームについて

    FC2のホームページを利用しています 入力フォームのサンプルを手本にして、以下のように作成しましたが 「送信ボタン」をクリックしても、メールが届きません。 どうしてでしょうか? <form action="mailto:xxx@xxx.ne.jp" enctype="text/plain" method="post"> <p><label>NAME:<br /> <input type="text" name="名前" value="" tabindex="1" accesskey="b"> </label></p> <p><label>E-MAIL:<br /> <input type="text" name="メールアドレス" value="" tabindex="2" accesskey="a"> </label></p> <p><label>感想・ご意見<br> <textarea name="title" rows="15" cols="30" tabindex="9" accesskey="i"> </textarea> </label></p> <p> <input type="reset" value="送信" tabindex="10" accesskey="s"> <input type="reset" value="取消" tabindex="11" accesskey="r"> </p> </form>

  • 掲示板の上部と下部にHTML枠を設けたい

    掲示板の上部と下部にHTML枠を設けたいのですが 下記で正解でしょうか?詳しい方、ご教示お願いします。 フォームより内容保存 掲示板にHTML出力 ブラウザーからデーターを送る部分(フォーム) <form action="bbs.cgi" method=POST> □上部表示部分<br> <textarea name=upper rows=5 style="width:99%;"></textarea> <br> <br> □下部表示部分<br> <textarea name=lower rows=5 style="width:99%;"></textarea> <input type=submit value="編集内容を保存"> </form> ##------------------------------------------------------------ # データがPOST形式 if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); # データを name 別に分割する @pairs = split(/&/, $buffer); # データハッシュ形式に変換する(%FORM) foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; # 文字の処理 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'euc'); $FORM{$name} = $value; }

  • このバグの解消方法は?

    実行してみれば分かると思いますが,以下のコードは自分が製作した進数変換プログラムです。しかし,文字数が多いとバグが出てしまう事が発見されました。この問題を解決するには,どこをどのように修正すべきなのでしょうか。 <br><script type=text/javascript><!-- function convdh(){dd=eval(document.toHex.DecData.value);document.toHex.HexResult.value=dd.toString(36);} function convhd(){hh=eval(0x+document.toDec.HexData.value);document.toDec.DecResult.value=hh.toString(10);} function compute() {s = document.f3.type.selectedIndex; if(s==0) z = parseInt(document.f3.n1.value,36); document.f3.result.value = z;} //--></script><form name=toHex><textarea name=DecData>ここに入力された10進数は,</textarea><textarea name=HexResult>36進数化されてここに表示されます。</textarea><input type=button onclick=convdh() value=演算></form><br><br><form name=f3><textarea name=n1>ここに入力された36進数は,</textarea><textarea name=result>10進数化されてここに表示されます。</textarea><input type=button onclick=compute(); name=check value=演算><br><br><select name=type><option selected>&hearts;</option></select></form><br> ジャバスクリプトは初心者です。お願いします!

  • HTMLでテキスト入力し表示させる

    HTMLでテキストボックスに文字を入力し、表示させたいのですがうまくできません。 見た目はできているようなのですが、文字が表示されない状態です。 コードを記載しますので、お手数をお掛けしますがご教授頂けますでしょうか。 <html> <head> <script> function add(){ document.getElementById("target").innerText = document.getElementById("name").value; target = document.getElementById("output"); document.write(target); } </script> </head> <body> <p>名前を入力してください</p> <input id="name" name="name" type="text" size="30" onkeydown="update_field();"> <br> <input type="button" onclick="add()" value="実行"> <form action="index.html" method="post"> <br> <input type="submit" name="exit" value="戻る"> </form> </body> </html>

  • textとtextareaの書式に設定について

    先日、質問をさせて頂きました者になります。 input textとtextareaの書式の設定制御の方法が、 分からなくなってしまい質問をさせて頂きました。 【やりたい事】 textやtextareaの初期値のテキスト色とバックグランの色を、 textやtextareaに初期値が入っている時と入力した値が入っている時に、 指定した書式に各種設定したいと思っています。 具体的には、textやtextareaに初期値が入っている時には、 初期値の文字を薄いグレー色に設定し、バックグランドをピンク色に設定し、 textやtextareaに入力をした値が入っている時には、 入力した文字を黒色に設定し、バックグランドを白色に設定したいと思ってます。 ご教授頂ければと存じます。 よろしくお願いいたします。 【ソース】 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN Frameset" "http://www.w3.org/TR/html4/frameset.dtd"> <html> <head> <script type="text/javascript"> <!--ログ生成スクリプトを取得--> function textoutput(formObj) { <!--text01を取得--> if((text01 = formObj.elements["text01"].value)==formObj.elements["text01"].defaultValue)text01=""; <!--text02を取得--> if((text02 = formObj.elements["text02"].value)==formObj.elements["text02"].defaultValue)text02=""; <!--textarea01を取得--> if((textarea01 = formObj.elements["textarea01"].value)==formObj.elements["textarea01"].defaultValue)textarea01=""; <!--textarea02を取得--> if((textarea02 = formObj.elements["textarea02"].value)==formObj.elements["textarea02"].defaultValue)textarea02=""; <!--出力データを作成--> var text = ''; <!--text3データを作成--> if(text01!==""){ text += '質問1:' + '\n'+ text01 + '\n'; } <!--text2データを作成--> if(text02!==""){ text += '質問2:' + '\n'+ text02 + '\n'; } <!--textarea01データを作成--> if(textarea01!==""){ text += '質問3:' + '\n'+ textarea01 + '\n'; } <!--textarea02データを作成--> if(textarea02!==""){ text += '質問4:' + '\n'+ textarea02 + '\n'; } <!--出力データを作成--> formObj.elements["output"].value=text; } </script> </head> <body> <form name="form01"> <strong>・諮問1:</strong><br> <input type="text" name="text01" value="1入力してください" id="p1" size="30" class="disabled" onfocus="if (this.value == defaultValue) this.value = '';" onblur="if (!this.value) this.value = defaultValue;"><br> <strong>・諮問2:</strong><br> <input type="text" name="text02" value="2入力してください" id="p2" size="30" class="disabled" onfocus="if (this.value == defaultValue) this.value = '';" onblur="if (!this.value) this.value = defaultValue;"><br> <strong>・諮問3:</strong><br> <textarea name="textarea01" id="textarea01" cols="60" rows="5" onfocus="if(this.value == this.defaultValue) this.value=''" onblur="if(this.value == '') this.value=this.defaultValue"> 3入力してください </textarea><br> <strong>・諮問4:</strong><br> <textarea name="textarea02" id="textarea02" cols="60" rows="5" onfocus="if(this.value == this.defaultValue) this.value=''" onblur="if(this.value == '') this.value=this.defaultValue"> 4入力してください </textarea><br> <strong>・出力結果:</strong><br> <input type="button" value="ログ出力" onClick="textoutput(this.form);">&nbsp;<br> <textarea cols=60 rows=20 name="output" id="output"></textarea><br> <textarea id="text" cols="30" rows="5" wrap="soft"></textarea><br> <button onclick="save();">save</button><a id="anchor" href=""></a> </form> </body> </html>

  • ラジオボタンとテキストを同時にグレーアウトさせる

    <input type=radio name="1" value = 'A1'">A1<br> <input type=radio name="1" value = 'A2'">A2<br> <input type=radio name="1" value = 'A3'">A3<br> <input type=radio name="1" value = 'A4'">A4<br> <input type=radio name="1" value = 'A5'">A5<br> <form> <input type=radio name="tex" onClick="textform.textin.value = 'B1'">B1<br> <input type=radio name="tex" onClick="textform.textin.value = 'B2'">B2<br> <input type=radio name="tex" onClick="textform.textin.value = 'B3'">B3<br> <input type=radio name="tex" onClick="textform.textin.value = 'B4'">B4<br> <input type=radio name="tex" onClick="textform.textin.value = 'B5'">B5<br> </form> <form id="textform" action="#"> ここに文字が表示されます <input id="textin" type="text" size="30"> </form> A1を選択した場合、B2とB4とテキストエリアをグレーアウトさせる A2を選択した場合、B3とテキストエリアをグレーアウトさせる この記述の方法がわかりません。 初心者ですので、どなたかご教授おねがいします。

  • フォームに入力したデータの受け渡しについて

    左右に分かれたフレームを使用したページ作成を検討しています。 左フレーム内のフォームへ入力したテキストやチェックボックスのデータを、 右フレームに設置した1つのテキストエリアへコピーボタンで受け渡しを行う方法を探しています。 テキストボックス1行だけの受け渡しはできるのですが、 複数のテキストエリアやチェックボックスを使用した場合の受け渡し方法をご教示いただきたけますでしょうか? 左フレームとしては↓のような内容を想定しています。 <html> <form> テキスト:</br> <input type="text" name="aaa" /></br> ラジオ:</br> <input type="radio" name="bbb" value="radio1" checked="checked" /> ラジオ1 <input type="radio" name="bbb" value="radio2" /> ラジオ2</br> チェック:</br> <input type="checkbox" name="ccc" value="check1" /> チェック1 <input type="checkbox" name="ccc" value="check2" /> チェック2</br> 選択項目:</br> <select name="ddd"> <option>A</option> <option>B</option> </select></br> テキストエリア</br> <textarea name="eee" rows="2" cols="15">テキストエリア1</textarea> </br> <input type="submit" value="送信" />  <input type="reset" value="リセット" /> </form> </html> よろしくお願いいたします。

専門家に質問してみよう