0

住所ブロックを分析し、この配送先住所の郵便番号が特定のリストのいずれかに含まれている場合 (たとえば、オリンピックの影響を受ける)、エラー メッセージを表示する JavaScript 機能を作成する必要があります。indexOf を使用して、住所ブロックの内容を影響を受ける郵便番号のリストと照合しましたが、これは正常に機能します。

ただし、問題が発生するのは、indexOf が W3 を取得しているため、影響を受けない DW3 で始まる郵便番号が影響を受けるメッセージを表示するためです。以下のコードでわかるように、郵便番号の前のスペース、つまり「DW3」で一致させようとしましたが、これはまったく機能せず、理由がわかりません。

おそらく、正規表現はこのパターンに一致するより良い方法ですが、残念ながら私は正規表現が苦手なので、誰でもこれを手伝ってもらえますか?

アドレスの例は次のとおりです。

<address>Mr Jim Smith<br>
    Flat, 4 Spring Lane<br>
    EASTLEIGH<br>
    DW3 6LS<br>
    United Kingdom</address>

JavaScript は次のとおりです。

var AFFECTED_POSTCODES = ["DT1","DT10","DT11","DT2","DT3","DT4","DT5","DT6","DT8","DT9","E1","E10","E11","E13","E14","E15","E16","E18","E1W","E3","E6","E9","EC1A","EC2N","EC2R","EC2V","EC2Y","EC3M","EC3N","EC3R","EC3V","EC4","EC4M","EC4N","EC4R","EC4V","EC4Y","GU22","GU23","GU4","GU5","HA9","IG1","IG11","IG4","IG7","IG8","KT1","KT10","KT11","KT12","KT13","KT14","KT18","KT2","KT20","KT22","KT24","KT6","KT7","KT8","NW1","NW10","NW8","RH4","RH5","RM13","RM15","RM9","SE1","SE10","SE11","SE18","SE3","SE7","SL0","SL3","SW10","SW11","SW13","SW15","SW18","SW19","SW1A","SW1E","SW1H","SW1P","SW1V","SW1W","SW1X","SW1Y","SW3","SW5","SW6","SW7","SW8","TW1","TW10","TW11","TW19","TW5","TW6","TW7","TW8","TW9","UB3","UB7","W10","W11","W12","W14","W1B","W1C","W1G","W1H","W1J","W1K","W1T","W1U","W1W","W2","W3","W4","W5","W6","W7","W9","WC1A","WC1B","WC1E","WC1H","WC1N","WC1R","WC1V","WC2A","WC2B","WC2E","WC2N","WC2R"];
function checkPostcode(e){
    var isAffected = false,
        field = $('#delivery_details_wrapper address'),
        fieldText = $(field).text();
    for (var i=0; i<AFFECTED_POSTCODES.length; i++){
        var patt = ' ' + AFFECTED_POSTCODES[i];
        if (fieldText.indexOf(patt) !== -1) {
            isAffected = true;
        }
    }
    if (isAffected) {
        if ($('.warning').length === 0) {
            field.after('<p class="warning" style="margin-top: 10px; clear: both;">* Delivery to this postcode may be affected by the Olympics. For more info click <a href="'+ Arcadia.Loader.rootPath +'lib/html/olympic_message.html" class="lightbox" rel="lightbox({innerWidth: 600, innerHeight: 300})" title="Click here for postcodes that may be affected by the olympics">here</a></p>');
        }
    } else {
        $('.warning').remove();
    }
}
4

1 に答える 1

4

正規表現の方が確かに優れており、より簡潔で効率的です (式は最適なマッチング オートマトンにコンパイルされます)。それはまた非常に単純です。

var alternation = AFFECTED_POSTCODES.join('|');
var r = new RegExp('\\b(' + alternation + ')\\b');
var isAffected = r.test(fieldText);

ここで、\b平均は単語の境界に一致し、部分文字列の問題に対処します。郵便番号を正規表現リテラルで書き出すことさえできます - /\b(DT1|DT10...)\b/- 他の場所で配列が必要ない場合。

于 2012-07-23T10:22:29.233 に答える