2

HTML エンティティをテキスト領域に入力する制限に Regexp を使用すると、問題が発生します。

私はこの正規表現を使用しました-HTML/<(.|\n)*?>/g; エンティティを制限するために、それは私にとってはうまくいきますが、グローバル変数を宣言してこの正規表現を使用すると、毎回異なるテストケース(true/false)が異なります。

Jsfiddleがあります-これを試してください

「送信」ボタンをクリックすると、最初は「true」になり、2回目は同じコンテンツに対して「false」になります。

グローバルに宣言するたびに、正規表現が異なる - 異なるテストケースを返す理由を誰か教えてもらえますか?

お手伝いありがとうございます...!!!

4

2 に答える 2

7

これはg、RegExp でフラグを使用しているためです。

を使用する必要がある場合はg、関数内で正規表現を定義して、毎回新しい正規表現を取得できます

function CheckContent(){
  var RegForRestrictHtmlTags2 = /<(.|\n)*?>/g;  
  $('#txtJobDesc').val("AAAAAAAA<fff>AAAAAA");
  alert(RegForRestrictHtmlTags2.test($('#txtJobDesc').val()));
}

gフラグを使用すると、件名文字列内で複数の出現箇所を見つけることができます.test。一意の一致ごと.testに返され続けます。truefalse を返すと.test、事実上、開始位置に「リセット」されます。

この簡単な例を考えてみましょう

> var re = /a/g;
undefined

> var str = 'aaaaab';
undefined

> re.test(str); // first a
true

> re.test(str); // second a
true

> re.test(str); // third a
true

> re.test(str); // fourth a
true

> re.test(str); // fifth a
true

> re.test(str); // no more a's; reset
false

> re.test(str); // back to first a
true
于 2013-09-17T06:19:12.597 に答える
4

問題は、リテラルgでフラグを使用していることです。解決策は、フラグRegExpを削除することです。g


RegExp.test()(強調鉱山)のドキュメントによると:

と同様にexec(または組み合わせて)、test 同じグローバル正規表現インスタンスで複数回呼び出されると、前の match を過ぎて進みます

への最初の呼び出しの後、オブジェクトtestlastIndexプロパティが更新されます。への 2 番目の呼び出しのオフセットとして使用されるインデックス。パターンに一致するものはこれ以上ないため、2 番目の呼び出しが返され、0 にリセットされます。このJSFiddleで正規表現のプロパティが変更されていることがわかります。RegExp/<(.|\n)*?>/gtestfalselastIndexlastIndex

gフラグを削除すると、エンジンはlastIndexプロパティを無視します。

この投稿では、 の詳細な動作RegExp.exec( についても同様RegExp.text)について説明しました。

于 2013-09-17T06:19:32.293 に答える