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

aのときはAの処理、bのときはBの処理、cのときはCの処理をを行い、ただし条件が真になったら以降の条件を判断しないといった処理(1)を、ループを用いて実現したいと考えております。
色々と試行錯誤したのですが(2)、なかなか実現することができず、困っております。
つきましては恐れ入りますが、正しい記述方法をご教授いただけないでしょうか。JAVAスクリプト全くの初心者ですが、何卒よろしくお願いいたします。


(1)
txt = "abcd";//判断対象文字列
data0=txt.match(/a[^\&\"]*d/im);
data1=txt.match(/a[^\S<>\&\"]*b/im);
data2=txt.match(/b[^\S<>\&\"]*c/im);

alert0="A";
alert1="B";
alert2="C";

//条件が合致しない時は警告を発し、合致する時には指定ページを表示します。
if (!data0) {alert(alert0)};
else if (!data1){alert(alert1)};
else if (!data2){alert(alert2)};
else location.href = "ok.htm";


以上の処理をループを用いて実現したいと考え、一応以下のように記述してみたのですが、動作しませんでした。また、条件が真になったら、以降の条件を判断しない方法も分かりません。何卒よろしくお願いいたします。


(2)
for(a=0;a<=2;a++){

var aler=new Array(2);
var data=new Array(2);

aler[0]=alert("A");
aler[1]=alert("B");
aler[2]=alert("C");

txt = "abcd";
data[0]="(/a[^\&\"]*d/im)";
data[1]="(/a[^\S<>\&\"]*b/im)";
data[2]="(/b[^\S<>\&\"]*c/im)";

if (!txt.match data[a]) {
aler[a];
}
else location.href = "ok.htm";
}

A 回答 (3件)

またまた失礼します。



すみません。 前回までのスクリプトの動作を確認してみたら、このままでは正規表現がうまく判定されないようでした。
正規表現の表記をそのまま配列内に入れて、.match()メソッドの引数としてその配列を利用した場合、必ずnull値が返ってきていたみたいです。 確認を怠って失礼しました。

それで、対策ですが、正規表現オブジェクトを作成して、それを.match()メソッドの引数として渡してやると良いようです。
その部分も修正したスクリプトの内容を書きますね。

var aler=new Array(2);
var data=new Array(2);

aler[0]="A";
aler[1]="B";
aler[2]="C";

txt = "abcd";
data[0]="a[^\&\"]*d"; //aで始まりdで終わっているか
data[1]="a[^\S<>\&\"]*b"; //aの次にbがきてるか
data[2]="b[^\S<>\&\"]*c";
/* 配列dataの中身は、パターンマッチの対象となる文字列を定義します。 正規表現のオプションは、正規表現オブジェクトの方で定義します。 */
n=0;

for(a=0;a<=2;a++){
regexp=new RegExp(data[a],"im");
/* 上記で正規表現オブジェクトを作成しています。 パターンの設定は配列dataの文字列を利用し、オプションとしてimを選択しています。 */

if (!txt.match(regexp)) {
/* 上の正規表現オブジェクトをmatch()の引数として利用します。 */
alert(aler[a]);
break;
}
else {
n++;
if (n==3){location.href = "ok.htm";}
}
}

これでうまく動くのではないかと思います。 一応こちらでは、txt内の文字列を変更してみて、動作することを確認しました。
たびたび失礼しました。
    • good
    • 0
この回答へのお礼

度々とても丁寧にご指導いただきありがとうございました。大変感謝しております。ありがとうございました。

お礼日時:2003/03/14 22:25

補足見ました。


breakの記述はそれであっていると思います。

先ほどは見落としていたのですが、ループ側のスクリプトに、スクリプトの記述方法としては気になるところがもう一つあります。
aler[]という配列の中にメソッドを入れようとしているのですが、これはうまく動かないのではないかと思います。 配列の中には警告ウィンドウで表示させるメッセージのみを格納しておいて、警告を出す部分でalert(aler[a])とする方が良い気がしますが、いかがでしょうか。

あと、よくよく検討してみたら、このループではご期待の動作にならないと感じました。
for文でループさせて、条件を順次検討していく形にすると、一つ一つの条件ごとに条件分岐が判定されますが、例えばAの条件を検討した際に、if文での判定で条件からはじかれた場合、else文の処理が起動してしまい、Bの条件の検討がその後になってしまうと思います。 ですので、Aの条件で引っかかった場合は見かけ上うまく動いているように見えても、Bの条件で引っ掛けるテストをすると、うまくいかないのではないかと思われます。 (Aの条件に適合しただけですべての条件に適合したときの処理を行ってしまうのではないでしょうか)
そうならないように、もう少し改造して、

for(a=0;a<=2;a++){
if (!txt.match(data[a])) {
alert(aler[a]);
n=0;
break;
}
else {
n++;
if (n==3){location.href = "ok.htm";}// n==3の3は条件の数にして下さい
}
}

のようにしてみてはいかがでしょうか。
上記では、条件に適合するごとにnの中に1ずつ加算していき、もし総ての条件の数とnの値が一致した場合は、すべての条件に適合していると判断してページ遷移の処理を行います。 条件に適合しない部分があれば、その場で警告を発し、nの数を0に戻してループを終了します。
なお、このように記述するときは、他の変数・配列と一緒に「n=0」を定義しておくようにしてください。 そうしないと、エラーが出ます。

この回答への補足

ありがとうございました。
alert(aler[a])の件、上手く動作しました。
また、「if文での判定で条件からはじかれた場合、すぐにelse文の処理が起動してしまう」といった点についても詳しく教えていただきありがとうございました。

ところで、下記のように記述したのですが、やはり上手く動作してくれないようです。全文を記述してしまい大変申し訳ないのですが、もしも何か考えられる理由がありましたら、ご教授いただけるとありがたいです。度々申し訳ありません。

<html>
<head>
<title></title>
<script language="JavaScript"><!--

var aler=new Array(2);
var data=new Array(2);

aler[0]="A";
aler[1]="B";
aler[2]="C";

txt = "abcd";
data[0]="/a[^\&\"]*d/im"; //aで始まりdで終わっているか
data[1]="/a[^\S<>\&\"]*b/im"; //aの次にbがきてるか
data[2]="/b[^\S<>\&\"]*c/im";

n=0;

for(a=0;a<=2;a++){
if (!txt.match(data[a])) {
alert(aler[a]);
break;
}
else {
n++;
if (n==3){location.href = "ok.htm";}
}
}

// --></script>
</head>
<body>
</body>
</html>

補足日時:2003/03/14 05:53
    • good
    • 0

とりあえず、スクリプトが起動しないのは、



if (!txt.match data[a]) {

この部分の記述が不正だからだと思います。

if (!txt.match(data[a])) {

と書き換えて、data[x]の配列の中の文字列から括弧を除去すれば、一応は起動すると思います。

条件が真のときに他の処理を行わないという指定にする場合は、通常は(1)に示されているように、ifとelse if、elseで処理を振り分けるのが妥当です。
いまいちループで処理させるメリットが理解できないのですが、もしループを用いてif文をまとめたいのであれば、条件に適合した時点でループから強制的に抜けるような処理を追記すればいいと思います。 ループから強制的に抜けるための処理は、「break;」で定義できます。 これを、条件に適合した場合の処理の最後に追加すればよいのではないかと。

なお、蛇足ですが、配列や変数の定義等は、ループ回数により内容に変化がないのであれば、それらはループの外で定義する方がスクリプト的にスマートだと思いますよ。

見当違いでしたら、ごめんなさい。 参考になれば幸いです。
    • good
    • 0
この回答へのお礼

ありがとうございます。アドバイスいただきましたように、ifとelse ifの部分はとりあえずそのままにし、「(!txt.match(data[a]))」の部分を直した上で、(短くできる部分はないかと)他の場所を関数でまとめてみたところ、かなりすっきりし、また問題なく動作しました。
ただ、条件が10以上あるため、やはりまだ記述が長いようにも思われ、そこで再度ループも試みたのですが、残念ながら動作しないようです。
break;の使い方は
for(a=0;a<=2;a++){
if (!txt.match(data[a])) {
aler[a];
break;
}
else location.href = "ok.htm";
}
でよいでしょうか。
度々恐れ入りますが、教えていただるとありがたく存じます。よろしくお願いいたします。

お礼日時:2003/03/13 20:08

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