#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);
}