как проверить, начинается ли число с двух разрешенных чисел php?

#php

#php

Вопрос:

Как проверить, что числовая строка начинается с первых двух чисел только со следующего разрешенного списка:

01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, and 30.

 $number = 1234567890;

if(ctype_digit($number)){
    if (strlen($number) <= 10) {
        echo "The registered number is correct";
    } else {
        echo "The number must have 10 digits";
    }
} else {
    echo "Number must be digit / numeric only.";
}
  

Что я хочу добавить к этой функциональности, так это проверить, что указанное число, которое хранится в $number , должно начинаться с первых двух чисел, которые есть в списке, чтобы продолжить.

Комментарии:

1. С чего может начинаться целое число PHP 0 ? Являются ли входные данные, которые у вас есть, числами или они являются строками ?

2. @TimBiegeleisen Здравствуйте, цель моего кода состоит в том, что он является только числовым и должен содержать в общей сложности 10 цифр и, наконец, он должен начинаться с первых двух уже упомянутых чисел.

3. Это вообще не отвечает на мой вопрос :-(

4. @TimBiegeleisen Извините, они должны быть числовыми, но поскольку код выглядит так: $number = 1234567890; или так $number = "1234567890"; , мой код проверяет оба без проблем.

Ответ №1:

Другой способ — временно преобразовать число в строку и использовать регулярное выражение ^([01]d|2[0-4]|30) , чтобы проверить, начинается ли числовая строка с определенных значений, которые вы упомянули выше. Вы можете использовать preg_match функцию PHP, чтобы помочь проверить, соответствует ли строка регулярному выражению.

Таким образом, ваш код становится:

 if(ctype_digit($number)){
   if (strlen($number) <= 10 and preg_match('/^([01]d|2[0-4]|30)/', (string)$number)) {
       echo "The registered number is correct";
   } else {
       echo "The number must have 10 digits or it begins with incorrect values";
   }
} else {
   echo "Number must be digit / numeric only.";
}
  

Объяснение регулярного выражения:

  • ^ : Соответствует шаблону с начала строки
  • [01]d : Совпадения 00 , 01 , 02 , … , 10 , 11 , … , 19
  • 2[0-4] : Соответствует 20 , 21 , … , 24
  • 30 : Совпадения 30
  • ([01]d|2[0-4]|30) : Совпадение либо [01]d , 2[0-4] либо 30

preg_match функция возвращает 1 , если шаблон регулярного выражения успешно сопоставлен.

Комментарии:

1. если я добавлю данные следующим образом: $number= 0162323112; покажите мне это сообщение: Number must be digit / numeric only. и если это так: $number= "0162323112"; покажите мне это сообщение : The registered number is correct . Нормально ли это происходит?

2. PHP будет игнорировать любые нули, помещенные в самом начале числового значения, поэтому PHP будет читать 0162323112 как 162323112 , а затем преобразовывать это число в строку. Если необходимо хранить числовые значения, начинающиеся с нулей, вы можете рассмотреть возможность изменения типа данных $number на строку

3. @AnsonH Нет, это неверно, он не будет «игнорировать начальные нули», он будет интерпретировать его как восьмеричное число, преобразуя его в совершенно другое число. В моем ответе есть ссылка на руководство по php, где это объясняется, и вот пример , где вы можете это проверить.

4. CC @Valentina на мой предыдущий комментарий. Если вы полагаетесь на игнорирование начальных нулей, вы получите неверные результаты.

Ответ №2:

Если ваши разрешенные начальные числа хранятся в массиве, вы можете извлечь 2 первых числа из $number using substr() , а затем проверить с in_array() помощью .

Ответ №3:

Для этого вы можете использовать регулярные выражения, но кое-что на заметку: число, начинающееся с a 0 , будет интерпретироваться как octal и преобразовано в базовое значение 10. Чтобы избежать этого, вы должны указать число в кавычках:

 $number = '055231';

// Fill the list of allowed numbers
$allowed = array_map(function($number) { 
    // Fill each element to length 2 with '0' to the left
    return str_pad($number, 2, '0', STR_PAD_LEFT); 
}, range(1, 24));
$allowed[] = 30;

if (preg_match('/^d{2,10}$/', $number)) {
    // At this point we know it contains only numbers
    // Extract first two characters
    $start = substr($number, 0, 2);
   
    // Check if it's in the allowed list
    if (in_array($start, $allowed)) {
        echo "The registered number is correct";
    } else {
        echo "The number is incorrect";
    }
} else {
    echo "Number must be digit / numeric only.";
}
  

Разбивка регулярных выражений:

  • ^ и $ являются разделителями. Строка должна точно совпадать.
  • d . Класс символов Digit. Соответствует только числам.
  • {2,10} . Предыдущая группа должна иметь длину от 2 до 10 (поскольку она должна начинаться с двух цифр).

Ссылка на функцию:

Ответ №4:

Возможным альтернативным решением может быть жесткое кодирование допустимых префиксов и проверка, являются ли первые 2 символа строки одним из них, используя array_key_exists:

 $valid_prefixes = array_fill_keys(array("01", "02", "03", "04", "05",
                                        "06", "07", "08", "09", "10",
                                        "11", "12", "13", "14", "15",
                                        "16", "17", "18", "19", "20",
                                        "21", "22", "23", "24", "30"), true);

function starts_with_valid_prefix($str) {
  global $valid_prefixes;
  return strlen($str) >= 2 amp;amp; array_key_exists(substr($str, 0, 2), $valid_prefixes);
}