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

0

Я полагался на 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 a pass. Как разрешить только шестнадцатеричные номера?


ОБНОВЛЕНИЕ 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.
Теги:
validation
preg-match
hex

3 ответа

2
Лучший ответ

используйте совпадение без цифр в вашем регулярном выражении: $ 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-digit


if ($valid) {
echo "$id provided is valid";
}
else {
echo "$id provided is not valid";
}
  • 0
    Я думаю, это хорошая идея. Но когда я пишу код, я стараюсь не тестировать то, что не должно быть решением, легче вспомнить, что должно быть решением ;-)
  • 0
    +1 Это лучшее решение. @Croises, лучше положительно соответствовать тому, что вы ищете. preg_match('/\D/',$id) , вы нашли виновника.
Показать ещё 3 комментария
1

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

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

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

1

Вам нужно использовать привязки и использовать квантификатор + только для целых чисел:

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню