PHP: есть текстовое поле, которое позволяет пользователям вводить число, число, за которым следует k (или kb) или m или (mb) для обозначения размера файла и соответствующей обработки? - PullRequest
1 голос
/ 05 мая 2011

Я на самом деле изо всех сил пытаюсь это правильно произнести.

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

Если в ячейках нет букв, то интерпретировать его как байты, если присутствует k или kb, интерпретировать в kb и аналогично для mb.

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

<tr>
  <td class="label">File Size:</td>
  <td>
    <input id="filesize_min" name="filesize_min" class="text" value="<?php if (isset($_POST['dosearch']))
    {
        echo($filesize_min);
    }
    elseif (isset($_POST['advancedsearchsubmit']))
    {
        echo($_POST['hiddenfilesize_min']);
    }
    else
    {
        echo "";
    } ?>"><div id="kb">(kb min)</div>
  </td>
  <td>
    <input id="filesize_max" name="filesize_max" class="text" value="<?php if (isset($_POST['dosearch']))
    {
        echo($filesize_max);
    }
    elseif (isset($_POST['advancedsearchsubmit']))
    {
        echo($_POST['hiddenfilesize_max']);
    }
    else
    {
        echo "";
    }?>">
    <div id="kb">(kb max)</div>
  </td>
</tr>

UPDATE

Спасибо за все замечательные ответы, просто попробую некоторые из них прямо сейчас, за все проголосовали.

Ответы [ 4 ]

2 голосов
/ 05 мая 2011

Полагаю, что когда есть $ _POST ['odaarch '], вы уже обрабатывали форму и устанавливали filesize_min и filesize_max.Вы, кажется, спрашиваете о том, как выполнить эту обработку и правильно установить filesize_min и max, чтобы всегда быть в килобайтах, было бы что-то вроде следующего:

$_POST['filesize_min'] = trim($_POST['filesize_min']);
if (preg_match('^(\d+)\s*(k|m)b?$', $_POST['filesize_min'], $matches)) {
    $filesize_min = $matches[1];
    switch ($matches[2]) {
        case 'k':
            break;
        case 'm';
            filesize_min *= 1024;
            break;
        default:
            filesize_min /= 1024;
            break;
    }
} else {
    // Validation error
}

Я не проверял это, но я думаю, что этодолжно работать ... Вы можете сделать то же самое для filesize_max

2 голосов
/ 05 мая 2011

Моя попытка:

<?php
function strtobytes($str) {
    $result = 0;

    if (preg_match('/^(\d+)(.*)$/', $str, $m)) {
        list(, $intVal, $suffix) = $m;

        switch (strtolower(trim($suffix))) {
            case 'k': case 'kb':
                $intVal *= pow(1024, 1);
                break;

            case 'm': case 'mb':
                $intVal *= pow(1024, 2);
                break;

            case 'g': case 'gb':
                $intVal *= pow(1024, 3);
                break;

            case 't': case 'tb':
                $intVal *= pow(1024, 4);
                break;
        }

        $result = $intVal;
    }

    return $result;
}

foreach (array('512', '512k', '512kb', '512m', '512mb', '512g', '512gb', '512t', '512tb') as $str) {
    printf(
        '%s = %s bytes<br />',
        $str, strtobytes($str)
    );
}
2 голосов
/ 05 мая 2011

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

<select name="unit_min">
  <option value="1">bytes</option>
  <option value="1000">Kb</option>
  <option value="1000000">Mb</option>
</select>

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

2 голосов
/ 05 мая 2011

Преобразование строки в целое число (количество байтов). Тогда вы можете делать все, что угодно

$filesize;
if (is_numeric($filesize)) {
  $filesize = (int) $filesize;
} else {
  switch (true) {
    case strtolower(substr($filesize, -1)) === 'k':
      $filesize = substr($filesize, 0, -1) * 1024;
      break;
    case strtolower(substr($filesize, -2)) === 'kb':
      $filesize = substr($filesize, 0, -2) * 1024;
      break;
    // And so on for m/mb, g/gb ...
    default:
      // Invalid format (?)
      break;
  }
} 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...