2012-06-18 2 views
4

У меня есть javascript regex, который проверяет британские почтовые индексы. Он работает хорошо, но он не учитывает, что некоторые люди пишут его с пробелами в середине, а другие нет. Я попытался добавить это, но не могу его обработать: S UK-почтовые индексы состоят в основном из двух букв, за которыми следуют 1 или 2 номера, необязательные пробелы & 1 номер и 2 буквы.Javascript UK postcode regex

Вот мое регулярное выражение, которое проверяет почтовые индексы без пробелов:

[A-PR-UWYZa-pr-uwyz0-9][A-HK-Ya-hk-y0-9][AEHMNPRTVXYaehmnprtvxy0-9]?[ABEHMNPRVWXYabehmnprvwxy0-9]?{1,2}[0-9][ABD-HJLN-UW-Zabd-hjln-uw-z]{2}|(GIRgir){3} 0(Aa){2})$/g 

Есть идеи?

Редактировать

Я изменил регулярное выражение, как я понял, одна группа не хватало строчных символов.

+0

Почему вы хотите проверить почтовые индексы на стороне клиента? Я бы предпочел сделать строгую проверку на стороне сервера, так как злоумышленник может вставлять неверные данные независимо от ваших клиентских проверок. – jsalonen

+1

@jsalonen, это не «вредоносный ввод», конечно, проверка на стороне сервера является обязательной! Но вы также хотите показать своих пользователей по размеру клиента «Извините меня, сэр, я думаю, что вы допустили ошибку там, хотите ли вы ее исправить» – Adi

+1

Если вы проверяете почтовые индексы на стороне сервера, вы можете повторно использовать этот код в клиентских проверках: 1) отправлять данные на сервер для проверки, 2) если проверка не завершена (на стороне сервера), вернитесь к форме со специальным сообщением об ошибке. Таким образом, вам не нужно будет поддерживать два отдельных кода проверки почтовых индексов! – jsalonen

ответ

6

Альтернативным решением было бы удалить все пробелы из строки, а затем запустить его через регулярное выражение, которое вам уже есть:

var postalCode = '…'; 
postalCode = postalCode.replace(/\s/g, ''); // remove all whitespace 
yourRegex.test(postalCode); // `true` or `false` 
1

Я не знаю, как почтовый код Великобритании выполнен, и я не понял его из вашего описания. Кстати, вы можете добавить \s{0,1}, где вам нужно сказать «здесь у нас может быть пробел». Это означает «0 или 1 пробел».

6

2 буквы, за которыми следует 1 или 2 числа, необязательные пробелы & 1 номер и 2 буквы.

Пример:

/^[a-z]{2}\d{1,2}\s*\d[a-z]{2}$/i 

Разъяснения с http://www.myregextester.com/

^      the beginning of the string 
---------------------------------------------------------------------- 
    [a-z]{2}     any character of: 'a' to 'z' (2 times) 
---------------------------------------------------------------------- 
    \d{1,2}     digits (0-9) (between 1 and 2 times 
          (matching the most amount possible)) 
---------------------------------------------------------------------- 
    \s*      whitespace (\n, \r, \t, \f, and " ") (0 or 
          more times (matching the most amount 
          possible)) 
---------------------------------------------------------------------- 
    \d      digits (0-9) 
---------------------------------------------------------------------- 
    [a-z]{2}     any character of: 'a' to 'z' (2 times) 
---------------------------------------------------------------------- 
    $      before an optional \n, and the end of the 
          string 
+0

Определенно лучший вариант для британских почтовых индексов - мое единственное изменение было следующим: '/^[A-Za-z] {1,2} \ d {1,2} \ s * \ d {1} [A-Za -z] {2} $/i' – ThisGuyHasTwoThumbs

+0

@ThisGuyHasTwoThumbs не нужно использовать '{1}' и не включать оба случая при использовании '/ i', то есть:'/^ [az] {1,2} \ d {1 , 2} \ S * \ d [AZ] {2} $/i'. '\ d {1,2}' также может быть записана как '\ d \ d?'. – Qtax

+0

ах я вижу - я довольно новичок в регулярном выражении и все ручные маленькие сокращения :) спасибо :) – ThisGuyHasTwoThumbs

3

Согласно an archived page I found, спецификация является:

Pattern w/o space RLE    General 
AN NAA  ANNAA  A1 N2 A2   | A{1,2} N{2,3} A2 
ANN NAA ANNNAA  A1 N3 A2   | 
AAN NAA AANNAA  A2 N2 A2   | 
AANN NAA AANNNAA  A2 N3 A2   | 

ANA NAA ANANAA  A1 N1 A1 N1 A2 | A{1,2} N1 A1 N1 A2 
AANA NAA AANANAA  A2 N1 A1 N1 A2 | 

GIR 0AA We are British and for every rule there must be an 
      equal and opposite exception. 

Может быть, это слишком много хлопот, чтобы беспокоиться в проверке страницы. Помните, что вам придется поддерживать его, если когда-либо произойдут изменения. Рассмотрим минимальную проверку, например, ^[A-Z].+[0-9].+[A-Z]$. Не будьте «героем» и не составите код.

Если вы действительно хотите, чтобы проверить его против этой спецификации, общие правила (после зачистки пробельного) являются:

^([A-Z]{1,2})([0-9]{2,3})([A-Z]{2})$/i 
^([A-Z]{1,2})([0-9])([A-Z])([0-9])([A-Z]{2})$/i 
^GIR0AA$/i 

Как @Stefan отметил:/я для прецедентной нечувствительности.

Как только вы это сделаете, вы можете сопоставить группы (следовательно, фигурные скобки) и проверить, соответствуют ли буквы ограниченным диапазонам в документе. На этом этапе вы даже можете сохранить список разрешенных одно- и двухбуквенных кодов для почтовых индексов.

Общее правило для разделения Инкода (фрагмент перед пространством) из Outcode (фрагмент после пробела), по-видимому, заключается в том, что Исходный код начинается с последнего номера (даже для GIR).

Честно говоря, я перестану беспокоиться после базовой проверки.Если стоит проверить более полную спецификацию, то, вероятно, стоит проверить, что область почтового индекса существует, и если это стоит того, вы можете подключиться к реальной службе, которая извлекает адрес из почтового индекса. Эти службы с радостью сообщают вам, что почтовый индекс не существует, что является более надежной и поддерживаемой проверкой, чем вы когда-либо хотели писать.

[Edit: есть другая спецификация on Wikipedia конечно]

2

Мы обнаружили, что большинство регулярных выражений не полностью покрывают UK почтовые коды. Мы обнаружили, что необходимо, чтобы покрыть эти варианты:

  • A1 1Aa
  • A1A 1Aa
  • AA11 1Aa

Исходя из этого, я бы рекомендовал:

/^([A-Z][A-Z0-9]?[A-Z0-9]?[A-Z0-9]? {1,2}[0-9][A-Z0-9]{2})$/;

Почтовый индекс GIR0AA, принадлежащий Джиробанку, но больше не поддерживается, см. ссылка: http://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom

+0

Это отличный ответ. Но почему бы не укоротить его: '/^([AZ] [A-Z0-9] {0,3} \ s? [0-9] [A-Z0-9] {2}) $/i' – glboothby

+0

Это не позволяет почтовый индекс города Лондона или города Вестминстера (EC1A, WC2A и т. Д.). –

Смежные вопросы