Проверить числовое значение, но исключить шестнадцатеричное или научное обозначение

Я привык полагаться на is_numeric() чтобы убедиться, что данные, передаваемые от пользователей, являются числовыми. Я недавно обнаружил, что пользователи также могут передавать данные 0xFF (hexdec = 255).

Я хотел бы запретить все, что не является целым числом (и не шестнадцатеричным представлением).

Вот что я пробовал до сих пор.

$i_haxors_u = $_GET['id'];

$regex = '/[0-9]*/';
if (!empty($i_haxors_u) && !preg_match($regex, $i_haxors_u))
{
echo '<p>Invalid $i_haxors_u ' . strip_tags($i_haxors_u);
} else {
echo '<p>$i_haxors_u is numeric... maybe.';
}

Это по-прежнему дает такие значения, как 0xFF пропуск. Как разрешить только не шестнадцатеричные числа?


ОБНОВЛЕНИЕ 12 ноября 2014.

Обратите внимание, что выбранный ответ отлично работает для данных, передаваемых через GET, но не будет работать, если для переменной задано шестнадцатеричное значение.

$x = 0xFF;
if (is_numeric($x))
{
echo "<p>$x is a number.";
} else {
echo "<p>$x is not a number.";
}

if (preg_match('/^[\d]+$/',$x))
{
echo "<p>$x is a number.";
} else {
echo "<p>$x is not a number.";
}

$x = '0xFF';
if (is_numeric($x))
{
echo "<p>$x is a number.";
} else {
echo "<p>$x is not a number.";
}

if (preg_match('/^[\d]+$/',$x))
{
echo "<p>$x is a number.";
} else {
echo "<p>$x is not a number.";
}

Печать

255 is a number.

255 is a number.

0xFF is a number.

0xFF is not a number.

0

Решение

используйте не-цифры в вашем регулярном выражении: $ regex = ‘/ \ D /’;
принять ошибку и пройти при подтверждении того, что на входе нет цифр.

следующий код завершается успешно при id = 7, дает сбой при id = 7.2, 7.2x, ffff, 0xff, -1

$id = $_GET['id'];

//assuming failure:
$valid = false;

if (!preg_match('/\D/',$id)) { $valid = true; } //fail if containing non-digitif ($valid) {
echo "$id provided is valid";
}
else {
echo "$id provided is not valid";
}
2

Другие решения

Вы должны использовать якоря и использовать + квантификатор, разрешающий только целые числа:

$regex = '/^\d+$/';

С помощью + квантификатор также позволит вынуть !empty($i_haxors_u) состояние с \d+ будет применять 1 или более цифр.

1

Это просто потому, что вы должны проверить все числа:

$regex = '/^[0-9]+$/';

нет необходимости тестировать пустой с +

1
По вопросам рекламы [email protected]