質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

Q&A

2回答

1369閲覧

Perl(cgi)掲示板のコメント欄にNGをワードを書かれたら、「NGワードがあります」という表示を出したい

abokado

総合スコア0

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

0グッド

0クリップ

投稿2021/06/26 06:18

編集2021/06/27 01:52

掲示板のコメント欄にNGをワードを書かれた場合、

「NGワードがあります」

という表示を出したいと思っていますが、そのやり方が分かりませんでした。

ネットで調べたら

特定文字をNGワードとして、はねる場合は、以下(A)を組み込めば良いことが分かりました。

-(A)----------------------------------

@haijyo = ( 'バカ' ,'アホ' ,'頭が悪い' ); foreach $haijyo (@haijyo) { if ($FORM{'com'} =~ /$haijyo/) { &error_message('NGワードがあります'); } }

上記(A)を、ここでいただいたアドバイスに従って下記(B)に組み込こんでみました。

以下はPerlの掲示板プログラムの一部です。

-(B)-----------------------------------------------------------------

<TR><TD> <form action="$bbs_write" method="POST"> <input type=hidden name="mode" value="check1"> <input type=hidden name="ip" value=$ENV{'REMOTE_ADDR'}> <input type=hidden name="mail" value="$FORM{'mail'}"> <input type=hidden name="date" value="$FORM{'date'}"> <TABLE cellpadding="2" cellspacing="0" border="1"> <TR><TD><P id="p1">お名前:</p></TD><TD><input type="text" name="name" size="30" value="" maxlength="10"></TD></TR> <TR><TD><P id="p1">地域:</p></TD><TD><select name="sub"><option value='' selected>▼地域 EOM foreach $subs (@subss){ print "<option>$subs\n"; } print <<"EOM"; </select></TD></TR> <TR><TD><P id="p1">年齢:</p></TD><TD><select name="age"><option value='' selected>▼年齢 EOM foreach $ages (@agess){ print "<option>$ages\n"; } print <<"EOM"; </select></TD></TR> <TR><TD><P id="p1">コメント:</p></TD><TD> <textarea name="com" cols="50" rows="10"></textarea></TD></TR> <TR><TD></TD><TD><input type="submit" value="確認"></TD></TR> </TABLE> </form> </TD></TR></TABLE> EOM #■入力投稿内容確認モード sub check1{ &header; print <<"EOM"; <TABLE cellspacing="2" cellpadding="5" width="100%"> <TR><TD id="d07"><h5 id="h51">■$bbs_title (XXXX掲示板)</h5></TD></TR> <TR><TD><P id="p1"> 投稿内容確認 </p></TD></TR> <TABLE cellpadding="2" cellspacing="0" border="1" width="550"> <TR><TD><P id="p1">お名前:</p></TD><TD><P id="p1">$FORM{'name'}</p></TD></TR> <TR><TD><P id="p1">地域:</p></TD><TD><P id="p1">$FORM{'sub'}</p></TD></TR> <TR><TD><P id="p1">年齢:</p></TD><TD><P id="p1">$FORM{'age'}</p></TD></TR> <TR><TD><P id="p1">コメント:</p></TD><TD><P id="p1">$FORM{'com'}</p></TD></TR> EOM __@haijyo = ( 'バカ' ,'アホ' ,'頭が悪い' );__ if($FORM{'name'} eq ''){print "<P id=\"p6\">お名前が未記入です</p>";} elsif($FORM{'sub'} eq ''){print "<P id=\"p6\">地域が未選択です</p>";} elsif($FORM{'age'} eq ''){print "<P id=\"p6\">年齢が未選択です</p>";} elsif($FORM{'com'} eq ''){print "<P id=\"p6\">コメントが未記入です</p>";} else{ foreach $haijyo (@haijyo) { if ($FORM{'com'} =~ /$haijyo/) { &error_message('NGワードがあります'); } } print <<"EOM"; <P id="p6"> print <<"EOM"; <P id="p6"> 下の「投稿ボタン」を押すと、入力したメールアドレス宛てに「確認メール」が送信されます。<BR> 投稿ボタンを押す前に、再度ご確認下さい。</p> <input type="submit" value="投稿"> EOM } print <<"EOM"; </TD></TR></TABLE> </form><BR> <FORM> <INPUT type="button" value="戻って修正する" onClick="pageBack()"> </FORM> </TD></TR></TABLE><BR> EOM }exit;

NGワードがヒットすると、以下のような変化がありましたが、メッセージや「戻って修正する」ボタンが表示されません。

イメージ説明

下の図は、名前を空欄にした時ですが、メッセージが表示され、「戻って修正する」ボタンが表示されます。

イメージ説明

NGワードがヒットした時も、名前の空欄時と同じように、メッセージが表示され、「戻って修正する」ボタンが表示するには、どうすれば良いでしょうか?

よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/06/26 06:25

「未記入です」ができてるなら同じ、バリデーションの範疇とは思いますが、そちらも自分では書かれてないんでしょうか
abokado

2021/06/26 06:50

コメントありがとうございます。 自分では、以下のことを試しました。 elsif($FORM{'com'} eq ''){print "<P id=\"p6\">コメントが未記入です</p>";} のコードの次に elsif($FORM{'com'} =~ /$haijyo/){print "<P id=\"p6\">NGワードです</p>";} と書いて、コメント欄にNGワードのある文書やNGワードのない文書を書いてテストしましたが、投稿すると、NGワードのない文書でも常に「NGワードがあります」という表示が出て困っています。 よろしくお願い致します。
m.ts10806

2021/06/26 06:52

@haijyoという配列使ってませんよね。 元の「見つけてきた」コードがループの中でチェックしてるのは理解されてますか?
abokado

2021/06/26 07:13 編集

ご返信ありがとうございました。 はい、foreachのループでNGワードを順番にチェックしているのは理解していますが、foreachをどこに入れるかが、よく分かりません。 elsif foreach $haijyo (@haijyo) {($FORM{'com'} =~ /$haijyo/){print "<P id=\"p6\">NGワードです</p>";} } と書いたら、500エラーが出ました・・・(汗) どうかアドバイスのほど、よろしくお願い致します。
guest

回答2

0

elseとforeachの位置関係についてのみ答えるなら、以下のような感じでしょう。

elsif($FORM{'com'} eq ''){print "<P id=\"p6\">コメントが未記入です</p>";} else{ foreach $haijyo (@haijyo) { if ($FORM{'com'} =~ /$haijyo/) { &error_message('NGワードがあります'); } }  print <<"EOM"; ...

投稿2021/06/26 11:02

KojiDoi

総合スコア13692

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

abokado

2021/06/26 14:18

こんばんは。 お世話になっております。 詳細かつ具体的なアドバイスをいただきまして、誠にありがとうございました。 NGワードを認識して、図の通り、表示も出るようになりました! かなり前進したので、感動しています! 但し、NGワードがあっても投稿ボタンが表示されてしまいます。 elsifで書くと、良いかと思い、 elsif{ foreach $haijyo (@haijyo) { if ($FORM{'com'} =~ /$haijyo/) { &error_message('NGワードがあります'); } } と書きましたが、500エラーが出てしまいました。 どうすれば、投稿ボタンを表示させないで、「戻って修正する」ボタンだけを出せるようにできるのでしょうか? どうかアドバイスのほど、よろしくお願い致します。
KojiDoi

2021/06/26 15:45

まずはm.ts10806さんに指摘されているように、質問文を<code>を使って書き直し、ソースが正しく表示されるようにしてください。
KojiDoi

2021/06/26 15:47

elsifはelse + ifなので、ifの後に条件式が必要です。それがないのでエラーが出ています。当然の結果です。 なぜelsifにすべきと思ったのでしょうか。なんとなくではなくちゃんと理解してコードを書くようにしないといつまでも完成しませんよ。
abokado

2021/06/27 01:58

おはようございます。 ご回答、誠にありがとうございました。 勉強不足と理解不足があり、申し訳ございませんでした。 ご指摘の通りだと思います。 あと質問文にcodeを使いました。 いろいろありがとうございます。 教えていただいたコードを改良しないで、そのままにして、再度、検証したところ、NGワードがヒットした時には、メッセージは表示されていませんが、投稿ボタンが消えて、投稿はできない状態になっていました。 メッセージを出す方法と、NGワードがヒットした時に一番下にある print <<"EOM"; </TD></TR></TABLE> </form><BR> <FORM> <INPUT type="button" value="戻って修正する" onClick="pageBack()"> </FORM> </TD></TR></TABLE><BR> EOM }exit; へ飛ばすには、どうするのが良いのでしょうか? どうかアドバイスのほど、よろしくお願い致します。
KojiDoi

2021/06/27 04:46

スクリプトの全部を公開して頂く必要はありませんが、第三者が読んでそのまま検証できる程度には整えたコードを示してもらえませんか。 print <<"EOM"; <P id="p6"> print <<"EOM"; <P id="p6"> 明らかに異常な入れ子になっており、まともに動くはずがないのは明らかです。 __@haijyo = ( この__はなんですか?? 手を抜きすぎです。
guest

0

無理やりifに全部入れるんじゃなく関数にしてチェック結果true/falseだけ返すようにすればよいのでは?
Perlの場合はサブルーチンですかね。

投稿2021/06/26 07:44

m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

abokado

2021/06/26 14:36 編集

アドバイス、ありがとうございました! サブルーチン方式もやってみましたが、500エラーが出てしまいました(汗) sub ngword { open(FH,"./ng.cgi"); @Fdata = <FH>; close(FH); $rtrn = 0; foreach $frch ( @Fdata ){ $frch =~ s/\n//g; if ( $_[0] =~ /$frch/ ) { $rtrn = 1; } } return $rtrn; } # NGワードを判定 if(&ngword($FORM{'com'}) == 1){ &error("NGワードがあります"); } 思った通りいかず、なかなか難しいです。。。
m.ts10806

2021/06/26 22:09

500はなにかしらの構文エラーでしょうけど、 &error() はサブルーチンですよね。 定義してなきゃエラーになるのは当然かと。 現状の自身のコードに当てはめるなら、printじゃないですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問