PHP:有一个文本框,允许用户输入一个数字,这个数字后面跟着k(或kb)或m或(mb)来表示文件大小和相应的处理


PHP: have a text box that allows users to enter a number, a number followed by k (or kb) or m or (mb) to denote filesize and process accordingly?

我真的很难把这个词恰当地表达出来。

我现在有一个表单,要求最小和最大文件大小(kb),但我想尝试的是允许用户通过创建一些规则来决定他们的最大和最小文件大小,例如:

如果方框中没有字母,则解释为字节,如果有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>

谢谢你所有的好答案,我只是想试试其中的一些,所有的都得到了赞。

My try:

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

将字符串转换为整数(字节数)。然后你可以做任何你喜欢的

$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;
  }
} 

你可以把它变成一个函数,以获得更好的可重用性。

您当然可以使用正则表达式或字符串函数来检测输入中的某些字符串,但是对于您和用户来说,仅仅添加一两个选择不是更容易吗?用户可以简单地选择单位,并为您提供一个乘数,例如对于最小值:

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

在一个输入框中混合数字值和字符串值似乎是错误的方法。

我想,当有$_POST['dosearch']你已经处理过的形式之前,并设置了filesize_min和filesize_max您似乎在询问如何进行该处理并将filesize_min和max正确地设置为始终以kb为单位,类似于以下内容:

$_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

执行相同的操作