Вопрос

У меня есть форма веб-сайта, которая требует ввода номера телефона в США для последующих целей, и в данном случае это очень необходимо.Я хочу попытаться исключить пользователей, вводящих нежелательные данные. 330-000-0000.Я видел некоторые варианты третьих лиц, которые проверяют номера телефонов за вас, однако я не знаю, является ли это лучшим вариантом в данной ситуации.Однако, если вы когда-либо использовали одну из этих третьих сторон и можете дать рекомендацию, мы также будем очень признательны.

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

  • не номер 555
  • не содержит 7 одинаковых цифр
  • действительный код города (он легко доступен)
  • не 123-1234 или 123-4567
  • Думаю, я бы тоже мог сосчитать 867-5309 (хех*)

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

Это было полезно?

Решение

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

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

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

В любом случае, простой тест принесет вам хорошие результаты, а переход к более сложным наборам правил будет отнимать все больше времени, принося при этом все меньше пользы (но также потенциально добавляя ложные срабатывания, как уже было показано на примере «семи из семи правил»). та же цифра» и случаи 867-5309).

Другие советы

Вы можете выполнить проверку номера телефона внутри своего приложения, используя регулярные выражения.В зависимости от вашего языка вы можете вызвать функцию, которая вернет true, если указанный номер телефона соответствует выражению.

В PHP:

function phone_number_is_valid($phone) {
    return (eregi('^(?:\([2-9]\d{2}\)\ ?|[2-9]\d{2}(?:\-?|\ ?))[2-9]\d{2}[- ]?\d{4}$', $phone));
}

Вы можете найти различные регулярные выражения в Интернете.Я нашел тот, что выше, на http://regexlib.com/DisplayPatterns.aspx?categoryId=7&cattabindex=2

Редактировать:Некоторые языковые сайты для регулярных выражений:

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

Amybe взгляните на ответы на этот вопрос.

867-5309 — это действительный номер телефона, который назначается людям с разными кодами городов.

В Django есть небольшой приятный пакет под названием localflavor, который имеет множество кодов проверки для конкретной страны, например почтовые индексы или номера телефонов.Вы также можете посмотреть исходный код и узнать, как django обрабатывает эти данные для страны, которую вы хотите использовать;Например: Проверка формы в США.Это также может быть отличным источником информации о странах, о которых вы мало что знаете.

Ваши клиенты по-прежнему могут делать то же, что и я: выдавать местный номер кинофона.

Кроме того, 123-1234 или 123-4567 являются недопустимыми числами, поскольку префикс начинается с 1, но 234-5678 или 234-1234 на самом деле будут действительными (хотя они выглядят фальшивыми).

Если вы придерживаетесь только чисел в формате США и Канады, я думаю, что следующее регулярное выражение может работать:[2-9][0-9][0-9]-[2-9][0-9][0-9]-[0-9][0-9][0-9][0- 9] и ![2-9][0-9][0-9]-555-[0-9][0-9][0-9][0-9]

Также нужно учитывать десятизначный набор номера, который сейчас используется в некоторых областях:это отличается от междугородного набора (т. е. 303-555-1234, а не 1-303-555-1234).В некоторых местах действительный номер телефона состоит из десяти цифр;в других - семь.

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

В своем исследовании, которое мне следовало провести заранее >.<, я обнаружил, что 7 одинаковых цифр являются действительными телефонными номерами.Так что я могу сосчитать это правило.

Это быстрая функция, которую я использую (ниже).У меня есть доступ к базе данных почтовых индексов, которая содержит данные о кодах городов и префиксах, которые обновляются ежемесячно.Я часто думал о том, чтобы проверить данные, чтобы подтвердить существование префикса для кода города.

    public static bool isPhone(string phoneNum)
    {
        Regex rxPhone1, rxPhone2;

        rxPhone1 = new Regex(@"^\d{10,}$");
        rxPhone2 = new Regex(@"(\d)\1\1\1\1\1\1\1\1\1");

        if(phoneNum.Trim() == string.Empty)
            return false;

        if(phoneNum.Length != 10)
            return false;

        //Check to make sure the phone number has at least 10 digits
        if (!rxPhone1.IsMatch(phoneNum))
            return false;

        //Check for repeating characters (ex. 9999999999)
        if (rxPhone2.IsMatch(phoneNum))
            return false;

        //Make sure first digit is not 1 or zero
        if(phoneNum.Substring(0,1) == "1" || phoneNum.Substring(0,1) == "0")
            return false;

        return true;

    }

Я не знаю, правильно ли это место, это функция форматирования, а не функция проверки, я подумал, давайте поделимся ею с сообществом, может быть, однажды это будет полезно..

Private Sub OnNumberChanged()
    Dim sep = "-"
    Dim num As String = Number.ToCharArray.Where(Function(c) Char.IsDigit(c)) _
                                                 .ToArray
    Dim ext As String = Nothing
    If num.Length > 10 Then ext = num.Substring(10)
    ext = If(IsNullOrEmpty(ext), "", " x" & ext)
    _Number = Left(num, 3) & sep & Mid(num, 4, 3) & sep & Mid(num, 7, 4) & ext
End Sub

Моя функция проверки выглядит так:

Public Shared Function ValidatePhoneNumber(ByVal number As String)
    Return number IsNot Nothing AndAlso number.ToCharArray. _
                                  Where(Function(c) Char.IsNumber(c)).Count >= 10
End Function

Я вызываю эту последнюю функцию @ метод OnNumberChanging(number As String) объекта.

Для проверки по телефону в США и за рубежом я нашел этот код наиболее подходящим:

((\+[1-9]{1,4}[ \-]*)|(\([0-9]{2,3}\)[ \-]*)|([0-9]{2,4})[ \-]*)*?[0-9]{3,4}?[ \-]*[0-9]{3,4}?$

Вы можете найти (хотя и несколько устаревшее) обсуждение здесь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top