• ベストアンサー

置換処理で500エラー

掲示板のCGIを作成し、運営してましたが最近 業者からの書込が増えてきたため「特定の文字を消去」するようにしました。 $com : 掲示板の書込内容 @word : 消去するための特定文字 変数 foreach (@word) {  if ($_) {   $com =~ s/$_/---/ig;  } } 取りあえず「特定文字」を変数扱いにし、「---」に置き換えるようにしたのですが、「特定文字」によっては『500 Internal Server Error』が出てしまいます。(例)オープン など どのように記述したら宜しいのでしょうか? ご教授下さいm(__)m

  • Perl
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.2

それは文字コードがシフトJISであるために起こる問題です。 シフトJISの全角文字は2バイトで構成されていますが、いくつかの文字はその2バイト目にアスキー文字が割り当てられているのです。 例えば「オープン」の場合、ー が 0x81 0x5B というコードであり、2バイト目の 0x5B が [ (開き大括弧)のコードであるため、これが正規表現のメタ文字として扱われ、対応する括弧がないためにエラーとなるのです。 幸い正規表現には「特定区間のメタ文字を無効化するメタ文字」が用意されているので、これを利用して   $com =~ s/\Q$_\E/---/ig; とするとよいでしょう。 ※メタ文字が含まれる可能性のある箇所を、\Q~\E で囲みます。 その他にも回避方法はあるのですが、他の問題を引き起こしやすいので、この方法がお勧めです。

kazon_ume
質問者

お礼

ご回答ありがとうございます。 文字コードが関係しているのですね。 早速、利用させて頂きますm(__)m ありがとうございました。

その他の回答 (1)

回答No.1

質問にあるソースをコピペでプログラムを作ってみましたが問題ないようです。 パーミッション等は大丈夫でしょうか。 一つ気になった点ですが、インデントは半角スペースまたはタブで設定されてますでしょうか? 説明が下手ですいません。 少しでも参考になれば幸いです。 私が書いたソースは下記になります。 ----------------------------------------- #! /usr/bin/perl $com = qq[ テストようの文字列です。 aaa,bbb,ccc,ddd,EFG,AAA ]; @word = ( "aaa", "テスト", ); foreach (@word) { if ($_) { $com =~ s/$_/置換後/ig; } } print "content-type:text/html\n\n"; print "$com";

kazon_ume
質問者

お礼

ご回答ありがとうごさいます。 インデントはタブで設定してます。 @word = ("aaa","テスト"); は私もOKでしたが、 @word = ("aaa","テスト","オープン"); にすると500エラーが表示されてました。

関連するQ&A

  • CGIで記述した文字が 化けてしまいます

    簡単な掲示板を作成していますが、 CGIで記述した文字が画面に表示されると文字化けしてしまいます。 作成した掲示板の入力文字は、文字化けせずにファイルに書き出され 表示できます。 CGI内で記述した文字だけ出来ません? OSはWIN/ME, 編集は ワードパッドで行っています。

    • ベストアンサー
    • CGI
  • 変数に禁止された文字が含まれている場合の処理について

    掲示板を作っています。 コメントの登録時に、禁止された文字が含まれていた場合に、投稿をとめる方法について教えてください。 例えば、コメント(変数名$com)に■、▲、●といった文字が含まれている場合に処理を止める方法です。 (イメージ) 変数$comに、"■" or "▲" or "●"を 含む場合 →  print "禁止文字が含まれています"; exit; 含まない場合 → // 投稿処理 $sql = "update BBS set ・・・・ ・・・・ ・・・・ 以上、宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 外部ファイルを別のHTMLファイルに表示したいと思います

    WEBページのHTMLファイルに外部のファイルから文字を読み込むことが出来たと思います。 Javascriptを使うのではなく、掲示板のようなCGIを利用したいと思うのです。 ホームページの作成にあまり詳しくない人が、HTMLファイルを書き換えてアップロードするのは難しいので、掲示板のように簡単に書き込めるCGIを設置して、そこに書込をすれば特定のページに文字や文章が貼り付けられる、という風に利用したいのです。 うろ覚えなのですが、 ・拡張子をHTMLからSHTMLにするということ ・表示したい部分のソースに<!--#exec cgi="○○.cgi"-->と加えるということ 等が条件だったと思います。 ○○.cgiの部分にあたるスクリプトがどこで公開されていたか、どんな物だったか記憶にないのですが、 ご存じの方があれば教えてください。

  • BBCode削除&改行をサニタイジングBBCode

    read.cgi #------------------------------------------------- # BBCode(特定の文字列をHTMLタグに変換) #------------------------------------------------- sub bbcodecnv { my $str = shift; $str =~ s/\[b\](.*?)\[\/b\]/<b>$1<\/b>/ig; $str =~ s/\[i\](.*?)\[\/i\]/<i>$1<\/i>/ig; $str =~ s/\[u\](.*?)\[\/u\]/<span style=\"text-decoration:underline\">$1<\/span>/ig; $str =~ s/\[s\](.*?)\[\/s\]/<span style=\"text-decoration:line-through\">$1<\/span>/ig; $str =~ s/\[code\](.*?)\[\/code\]/<code>$1<\/code>/ig; $str =~ s/\[url=((?:htt|ft)ps?\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%\,]+)\](.*?)\[\/url\]/<a href=\"$1\" target=\"$target\" rel=\"nofollow\">$2<\/a>/ig; $str =~ s/\[color=(\#[0-9A-F]{6}|[A-Z]+)\](.*?)\[\/color\]/<span style=\"color:$1\">$2<\/span>/ig; $str =~ s/\[list=1\](.*?)\[\/list\]/<ol style="list-style-type: decimal">$1<\/ol>/g; $str =~ s/\[list=A\](.*?)\[\/list\]/<ol style="list-style-type: upper-alpha">$1<\/ol>/g; $str =~ s/\[list=a\](.*?)\[\/list\]/<ol style="list-style-type: lower-alpha">$1<\/ol>/g; $str =~ s/\[list=I\](.*?)\[\/list\]/<ol style="list-style-type: upper-roman">$1<\/ol>/g; $str =~ s/\[list=i\](.*?)\[\/list\]/<ol style="list-style-type: lower-roman">$1<\/ol>/g; $str =~ s/\[list\](.*?)\[\/list\]/<ul style="list-style-type: disc">$1<\/ul>/ig; $str =~ s/\[\*\]/<li>/ig; return $str; } #------------------------------------------------- # BBCode削除 #------------------------------------------------- sub bbcodedel { my $str = shift; $str =~ s/\[b\](.*?)\[\/b\]/$1/ig; $str =~ s/\[i\](.*?)\[\/i\]/$1/ig; $str =~ s/\[u\](.*?)\[\/u\]/$1/ig; $str =~ s/\[s\](.*?)\[\/s\]/$1/ig; $str =~ s/\[code\](.*?)\[\/code\]/$1/ig; $str =~ s/\[url=((?:htt|ft)ps?\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%\,]+)\](.*?)\[\/url\]/$1/ig; $str =~ s/\[color=(\#[0-9A-F]{6}|[A-Z]+)\](.*?)\[\/color\]/$2/ig; $str =~ s/\[list=1\](.*?)\[\/list\]/$1/g; $str =~ s/\[list=A\](.*?)\[\/list\]/$1/g; $str =~ s/\[list=a\](.*?)\[\/list\]/$1/g; $str =~ s/\[list=I\](.*?)\[\/list\]/$1/g; $str =~ s/\[list=i\](.*?)\[\/list\]/$1/g; $str =~ s/\[list\](.*?)\[\/list\]/$1/ig; $str =~ s/\[\*\]/ig; return $str; } patio.cgi # 改行をサニタイジング・BBCode削除 $com =~ s/<br>/&lt;br \/&gt;/g; $com =~ s/\[b\](.*?)\[\/b\]/$1/ig; $com =~ s/\[i\](.*?)\[\/i\]/$1/ig; $com =~ s/\[u\](.*?)\[\/u\]/$1/ig; $com =~ s/\[s\](.*?)\[\/s\]/$1/ig; $com =~ s/\[code\](.*?)\[\/code\]/$1/ig; $com =~ s/\[url=((?:htt|ft)ps?\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%\,]+)\](.*?)\[\/url\]/$1/ig; $com =~ s/\[color=(\#[0-9A-F]{6}|[A-Z]+)\](.*?)\[\/color\]/$2/ig; $com =~ s/\[list=1\](.*?)\[\/list\]/$1/g; $com =~ s/\[list=A\](.*?)\[\/list\]/$1/g; $com =~ s/\[list=a\](.*?)\[\/list\]/$1/g; $com =~ s/\[list=I\](.*?)\[\/list\]/$1/g; $com =~ s/\[list=i\](.*?)\[\/list\]/$1/g; $com =~ s/\[list\](.*?)\[\/list\]/$1/ig; $com =~ s/\[\*\]/ig; エラーが出てしまいます。 どこがどう間違っていますか?? ※BBCode削除と 改行をサニタイジング・BBCode削除がたぶん ミスっていると思います。

    • ベストアンサー
    • Perl
  • 掲示板を作成する際に・・・

    掲示板を作成する際、 文章を等間隔に表示させたいために、 文章を格納している$comに <pre>$com</pre> としてみました。 (大抵のスクリプトでは、「図/表モード」 の場合、<pre>$comment</pre>となっていたからです。) 確かにこれで文字は等間隔に表示されましたがこれだと メッセージ欄で空行(一行空けること)を入れた場合、 空行が無くなり、改行にしかなりません。 改行(とタグ)に対して以下のようにしているのですが・・・・ $com =~ s/\"/&quot;/g; $com =~ s/</&lt;/g; $com =~ s/>/&gt;/g; $com =~ s/<br>//ig; $com =~ s/\r\n/<br>/g; $com =~ s/\r/<br>/g; $com =~ s/\n/<br>/g; $com =~ s/\t/ /g; CGIとPERLはまだかじった程度の知識しかないので どうすればいいのかわからないので教えていただきたいのですが・・・。

    • ベストアンサー
    • CGI
  • ロック機能を付け加えるには・・

    CGIで掲示板を運営しているのですが、2重の書き込み・読み取りを防ぎ、データーが消去されるのを防ぐロック機能というものがあると聞きました。 この機能を追加するにはどのようなプログラミングをすればよいでしょうか? 教えてください!!

  • Perl はどのくらい高負荷に耐えられますか?

    掲示板の運営をしているのですが、 将来アクセスが増えた時に備えて、 高い負荷に耐えられるようなCGIにしたいと思っています。 ちなみに現在はPerlで記述しています。 一つのCGIでいろいろ対応しているので、 ボリュームは2000行(70KB)くらいになっています。 そこで質問なのですが、 (1)Perlで記述したCGIはどの程度の負荷に耐えられるのでしょうか? (ちょっと漠然としていて申し訳ありません) (2)軽くするにはどういう事を検討すればよいでしょうか? (PHPにするとか、Cで書くとか、CGIを分割するとか)

    • ベストアンサー
    • CGI
  • Perlでのマッチング処理について

    検索CGIを作成しているのですが、検索文字に「ー」(-ハイフンではありません。日本語入力の言葉を伸ばすやつです。”サーバ”とか。)が入った文字を指定し、POSTするとServerErrorになってしまいます。サーバはレンタルものなので原因が分からず途方にくれています。どなたかPerlに詳しい方、ぜひよいアドバイスを下さい。ちなみに処理は下記のように行っています。 (1)検索する元のデータはsjisである。  ↓ (2)ブラウザのフォームから、検索したいデータがsjisでPOSTされる。  ↓ (3)ReadParseにてデータを変数へ取り込む。(cgi-lib.pl使用)  ↓ (4)CGIにて、POSTされたデータをeucへ変換。(jcode.pl使用)  ↓ (5)検索する元のデータが入ったファイルをオープン。  ↓ (6)ファイルから1行づつ読み込み変数へ格納。  ↓ (7)変数へ格納したデータをeucへ変換。  ↓ (8)if (${POSTされたデータ} =~ /${ファイルから読み込んだデータ}/)といった形でマッチング処理  ↓ (9)ファイルをクローズし、マッチングしたデータをsjisで結果表示。 ※まだデバッグ途中なのですが、とりあえず今判明しているのは 『インターネット』などというふうに、『ー』がキーに入るとエラーになります。 どなたかよろしくお願いします。

    • ベストアンサー
    • Perl
  • 特定の文字にリンクを貼る

    掲示板内などに書き込んだ特定の文字にリンクを貼るフリーのCGIサイトご存知ではないですか。宜しくお願い致します。

    • ベストアンサー
    • CGI
  • CGI でDBI->connectするとエラー発生

    お世話になります。 CGIでORACLEに接続しようとしたところ、Internal Server Errorが発生し 困っております。 環境: ORACLE:10.2.0 DBI:1.48 DBD:DBD-Oracle1.16 PERL:5.8.0 APACHE:2.2.0 OS:RED HAT LINUX ES 3.0 プログラム上落ちる場所: DBI->connectのところ エラーの発生する傾向: APACHEでCGIを実行した時だけ コマンドライン上で実行するとエラーは発生しない また、CGIでもDBI->connectを外すとエラーは起きない APACHEのエラーログ: install_driver(Oracle) failed: Can't load '/usr/lib/perl5/site_perl/5.8.0/i386-linux-thread- multi/auto/DBD/Oracle/Oracle.so' for module DBD:: Oracle: libnnz10.so: cannot open shared object file: No such file or directory at /usr/lib/perl5/5.8.0/i386-linux-thread- multi/DynaLoader.pm line 229 今までに試した事: ・環境変数の定義確認(LD_LIBRARY_PATH等、cgiに記述) ・環境変数の取得確認(cgi実行時に画面に表示) ・/etc/ld.so.confに$ORACLE_HOME/libを追記&ldconfig実行 ・httpd.confに環境変数のセットを記述(SetEnv) ・libclntsh.so.10.0が$ORACLE_HOME/lib以下にある事を確認 ・DBDをSTATICオプションをつけてインストール ・/usr/libや/libにOracle.soをコピー ・環境変数LD_RUN_PATH(Oracle.soのパス)を追加 一体どこが悪くて動かないのか、途方にくれております。 原因として何が考えられるか、その場合どう対処すれば良いか、 ご教示いただければ幸いです。 他にも必要な情報や、試すべき事がありましたら遠慮なくどうぞ。 よろしくお願い致します。

    • ベストアンサー
    • CGI

専門家に質問してみよう