Я написал 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}\)?
\(?02\d{3}\)?
to \(?02\d{2}\)?
\s?\d{3}-\s?\d{3}$
. {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);