Проверка номеров телефонов Великобритании в PHP

Я приобрел контактную форму. Большая вещь, но мне нужно преобразовать валидацию для номера телефона, чтобы разрешить форматы номеров в Великобритании – другими словами, чтобы допускать пробелы.

Сейчас он проверяет без пробелов и имеет минимальную длину 8 символов:

if(is_numeric($phone)) { if(!$phone || strlen($phone) < 8) { $error .= "Please enter your phone number without spaces.<br />"; } } else { $error .= "Please enter numeric characters in the phone number field.<br />"; } 

Номера телефонов обычно ужасны для шаблонов регулярных выражений, что вам и нужно.

Этот шаблон, например:

 $pattern = "/^(\+44\s?7\d{3}|\(?07\d{3}\)?)\s?\d{3}\s?\d{3}$/"; $match = preg_match($pattern,$input); if ($match != false) { // We have a valid phone number } else { // We have an invalid phone number } 

Этот шаблон будет соответствовать +44 включенному или нет.

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

 07222 555555 (07222) 555555 +44 7222 555 555 

Это не будет

 7222 555555 +44 07222 555555 (+447222) 555555 

Есть масса сайтов, которые предлагают учебники / чит-листы и т. Д. Для регулярных выражений, попробуйте некоторые из них:

http://regexlib.com/Default.aspx

а также очень хороший пост переполнения стека:

Полное регулярное выражение для проверки номера телефона

Значит, вы просто хотите разрешить пробелы?

Затем вы можете использовать str_replace() для игнорирования пробелов в начале:

 $phone = str_replace(' ', '', $phone); 

Функция is_numeric , которую вы используете, на самом деле не подходит для американских телефонных номеров. Например, он принимает шестнадцатеричные числа, такие как 0xABCDEF , которые он должен отклонить.

Для простого сопоставления текста регулярные выражения часто являются самым простым решением. Регулярное выражение указывает шаблон текста. PHP имеет функции, позволяющие вам искать или заменять совпадения регулярных выражений в тексте.

Если вы определяете номер телефона как строку из не менее 7 символов, содержащих только цифры и пробелы, соответствующее регулярное выражение будет /^[0-9 ]{7,}$/ . Текст внутри скобок представляет собой набор символов, {7,} указывает, что мы ищем по крайней мере 7 из этих символов в строке, а символы ^ и $ указывают, что наше совпадение должно начинаться в начале строки и заканчивается в конце строки. В документации PHP есть раздел, объясняющий регулярные выражения более подробно .

Вы должны использовать preg_match для обеспечения соответствия номера телефона:

 if (preg_match('/^[0-9 ]{7,}$/', $phone)) { 

Это соответствует всем форматам Великобритании с широким диапазоном знаков препинания:

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

Извлеките различные детали, используя этот шаблон

  ^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?|\+)(44)\)?[\s-]?\(?(?:0\)?[\s-]?\(?)?|0)([1-9]\d{1,4}\)?[\s\d-]+)(?:((?:x|ext\.?\s?|\#)\d+)?)$ 

Код страны составляет 1 доллар США (и является нулевым для национального формата). NSN находится в $ 2. Дополнительное расширение составляет $ 3.

Удалите все не цифры от $ 2 для дальнейшей обработки. Следующим шагом будет убедиться, что NSN находится в допустимом диапазоне и является допустимой длиной (9 или 10 цифр, в зависимости от диапазона).

Список шаблонов слишком длинный для воспроизведения здесь, но доступен по адресу:

http://aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers

Вы можете проанализировать ввод на целое число, затем проверить правильность количества цифр;

 $mobileNumber = intval($mobileNumber); if (preg_match('/(^\d{12}$)|(^\d{10}$)/',$mobileNumber)==TRUE) { //number has the right number of digits for a UK mobile number } else { //number does not have the right number of digits } 

Разъяснения;

$ mobileNumber = intval ($ mobileNumber);

Это удаляет все нечисловые символы из строки и приводит к нулю (например, пробелы, скобки, плюс знаки, десятичные знаки и т. Д.);

* if (preg_match ('/ (^ \ d {12} $) | (^ \ d {10} $) /', $ mobileNumber) == TRUE) {*

Это регулярное выражение затем проверяет, что строка содержит 12 или 10 цифр, которые будут охватывать 447712345678 (12 цифр) или 7791234567 (10 цифр). Он сопоставляется в двух подклассах (^ \ d {12} $) или (^ \ d {10} $), карат (^) и доллар ($) представляют собой все, начиная с самого начала (^) и до очень конец ($) строки. \ d представляет собой любую цифру, а следующая {12} означает совпадение с предыдущим утверждением, количество раз.

Это не означает, что число действительно, вы можете использовать API, например twillio, для дополнительной проверки номера numet https://www.twilio.com/help/faq/sms/does-twilio-check-to-see- если-телефон-номер-можно-получить-SMS

Например;

 $mobileNumber = '+447791234567'; $mobileNumber = intval($mobileNumber); //$mobileNumber is now 447791234567 if (preg_match('/(^\d{12}$)|(^\d{10}$)/',$mobileNumber)==TRUE) { //$mobileNumber matches (^\d{12}$) and is valid } 

Вы также можете добавить чек, чтобы убедиться, что номер начинается с «07» или «447», необходимого для мобильных телефонов Великобритании, например:

 function isValidMobile($aNumber){ $aNumber = intval($aNumber); return preg_match('/(^\d{12}$)|(^\d{10}$)/', $aNumber) && preg_match('/(^7)|(^447)/', $aNumber); } 

intval удаляет начальный ноль, поэтому регулярное выражение проверяет для leadin 7 или 447.