2

私は現在、サードパーティのJSライブラリを持つことができないプロジェクトに取り組んでいます(そうでなければ、これはjQueryで簡単になります)。このプロジェクトの内容の1つは、フォームの検証です。正規表現に関するいくつかの小さな問題を除いて、それはかなりうまく機能しています。

テキストフィールドの検証関数onchange()をトリガーしているので、タブアウトしてエラーが発生した場合はすぐにわかります。良いデータをタブアウトすると、すぐにわかります。検証が失敗した場合は、エラークラスを親要素に割り当てます。これは、検証を1回だけトリップする場合に正常に機能します。テストに失敗し続けると、エラークラスが蓄積されます。たとえば、検証を2回失敗すると、次のようになります。

<p class=" error">

3回失敗すると、次のようになります。

<p class=" error error">

検証に合格したら、以下のremoveClass()関数を呼び出します。基本的に、グローバル検索/置換を取得しているようには見えません。グローバル修飾子を追加すると上記のケースが処理されると確信していましたが、そうではなく、1つの「エラー」クラスのみが削除されます。

removeClass: function (el, name) {
    var regex = new RegExp('(^|\\s)' + name + '(\\s|$)', 'gi');
    el.className = el.className.replace(regex, ' ');
}

私の正規表現は、行の先頭または空白、「エラー」、空白または行の終わりを探しています。確かに、私は確かに正規表現を吸います:)

何か飛び出しますか?

4

1 に答える 1

4

これはグローバルに機能していますが、一致が見つかると、次に試行される一致は、前の一致の最後の文字の次の文字で始まります。これは、前のスペースではなくe2番目の文字です。error

//  v-----v-------first match
   " error error"
//         ^------continues here, no more matches because 
//                       there isn't a space before `e`.

テストするには、2つのクラスの間に2つ目のスペースを追加すると、機能します。

//  v-----v-------first match
   " error  error"
//         ^------continues here, and now it will match 

代わりに使用する修正がありますが\\b、これはどの文字とも一致しないため、次の一致はr前の一致の最後の文字の後に開始されerrorます。

new RegExp('\\b' + name + '\\b', 'gi');

@Josephが指摘しているように、スペース文字の蓄積を避けるために、を空の文字列に" "変更.replace()する必要があります。""

于 2011-09-06T00:48:24.650 に答える