I need to write some JavaScript functionality that analyses an address block and displays an error
message if the postcode in this delivery address is within one of a given list (eg. going to be affected by
the Olympics). I have used indexOf to match the contents of the address block against a list
of affected postcodes and this works fine.
However the problem occurs because a postcode starting with DW3 which is not affected will
display the affected message because the indexOf is picking up W3. As you can see in my
code below i have tried to match on a space preceeding the postcode
i.e. ” DW3″ but this doesn’t work at all and i have no idea why.
Perhaps regular expressions is a better way to match this pattern, unfortunately
I am terrible at regex, so can anyone help with this?
An example address would be:
<address>Mr Jim Smith<br>
Flat, 4 Spring Lane<br>
EASTLEIGH<br>
DW3 6LS<br>
United Kingdom</address>
here is the 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();
}
}
A regular expression would indeed be better, being more concise and more efficient (the expression will compile to an optimal matching automaton). It would also be quite simple.
Here the
\bmeans match a word boundary, which will deal with your sub-string problem.You may even just write out the postcodes in a regex literal –
/\b(DT1|DT10...)\b/– if you don’t need the array anywhere else.