Проверка телефонных номеров в Великобритании на PHP - PullRequest
1 голос
/ 11 ноября 2011

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

Сейчас он проверяется без пробелов и имеет минимальную длину 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 />";
}

Ответы [ 5 ]

7 голосов
/ 11 ноября 2011

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

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

$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

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

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

2 голосов
/ 11 ноября 2011

То есть вы просто хотите разрешить пробелы?

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

$phone = str_replace(' ', '', $phone);
1 голос
/ 06 ноября 2012

Соответствует всем британским форматам с большим количеством знаков препинания:

  ^\(?(?:(?: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

1 голос
/ 11 ноября 2011

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

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

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

Вы бы использовали функцию preg_match для убедитесь, что номер телефона соответствует:

if (preg_match('/^[0-9 ]{7,}$/', $phone)) {
0 голосов
/ 28 октября 2013

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

$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, для дополнительной проверкичисла https://www.twilio.com/help/faq/sms/does-twilio-check-to-see-if-phone-numbers-can-receive-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 удаляет ведущий ноль, поэтому регулярное выражение проверяет наличие 7 или 447.

...