Подтвердите номер телефона Великобритании, включая его код города

Я написал regex (объединение доступных из потоков diff) для проверки номеров в Великобритании.

В соответствии с регулярным выражением он должен проверять число 0208 123-4567 . Но это не так. В чем проблема?

Пример: http://ideone.com/pm1GT2

 <?php $number = '0208 123-4567'; validateUsNumber($number); function validateUsNumber($number) { $number= preg_replace( '/[^0-9]/', '', $number); $pattern = '/^(\+44\s?7\d{3}|\(?07\d{3}\)|\(?02\d{3}\)|\(?01\d{3}\)?)\s?\d{3}\s?\d{3}$/'; $match = preg_match($pattern,$number); if ($match != false) { echo " We have a valid UK phone number"; } else { echo " We have an invalid UK phone number " ; } } 

Вместо этого вы можете использовать это регулярное выражение:

 $pattern = '^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?|\+)44\)?[\s-]?\(?(?:0\)?[\s-]?\(?)?|0)(?:\d{2}\)?[\s-]?\d{4}[\s-]?\d{4}|\d{3}\)?[\s-]?\d{3}[\s-]?\d{3,4}|\d{4}\)?[\s-]?(?:\d{5}|\d{3}[\s-]?\d{3})|\d{5}\)?[\s-]?\d{4,5}|8(?:00[\s-]?11[\s-]?11|45[\s-]?46[\s-]?4\d))(?:(?:[\s-]?(?:x|ext\.?\s?|\#)\d+)?)$^'; 

Таким образом, ваш код должен выглядеть так:

 <?php $number = '0208 123-4567'; $number = '+44 20 8985 5577'; // or this validateUsNumber($number); function validateUsNumber($number) { $pattern = '^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?|\+)44\)?[\s-]?\(?(?:0\)?[\s-]?\(?)?|0)(?:\d{2}\)?[\s-]?\d{4}[\s-]?\d{4}|\d{3}\)?[\s-]?\d{3}[\s-]?\d{3,4}|\d{4}\)?[\s-]?(?:\d{5}|\d{3}[\s-]?\d{3})|\d{5}\)?[\s-]?\d{4,5}|8(?:00[\s-]?11[\s-]?11|45[\s-]?46[\s-]?4\d))(?:(?:[\s-]?(?:x|ext\.?\s?|\#)\d+)?)$^'; $match = preg_match($pattern,$number); if ($match != false) { echo " We have a valid UK phone number"; } else { echo " We have an invalid UK phone number " ; } } 

Это взято из http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers, и вы можете найти там больше валидаций по номеру телефона в Великобритании. Я использовал «1.1 Match GB номер телефона в любом формате».

он будет соответствовать этому:

 02083) 123456 

а не это:

 0208 123-4567 

из-за нескольких причин

  • у вас есть вторая скобка принудительная, измените \(?02\d{3}\) на \(?02\d{3}\)?
  • вы сохранили {3} и попытались совместить с 2 цифрами, измените \(?02\d{3}\)? to \(?02\d{2}\)?
  • вы не включили – hiphen нигде, поэтому, очевидно, это не будет соответствовать. измените последнюю часть на \s?\d{3}-\s?\d{3}$ .
  • ваш пример имеет 4 цифры после hiphen (-4567), поэтому измените последнюю часть своего регулярного выражения на квантификатор {4} .

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

 ^(\+44\s?7\d{3}|\(?07\d{3}\)|\(?02\d{3}\)?|\(?01\d{3}\)?)\s?\d{3}[-\s]?\d{4}$ 

это регулярное выражение будет соответствовать вашей потребности 0208 123-4567

как предложение, удалите + из демо-версии проверки регулярного выражения: http://regex101.com/r/kM8bC7

Ваш шаблон в основном ищет красиво отформатированное число, но его проверяют на результат зачистки нечисловых символов. После этого вы никогда не будете иметь +44 , пробел или круглые скобки:

 $number= preg_replace( '/[^0-9]/', '', $number);