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

PHP:有一个文本框,允许用户输入一个数字,数字后跟k(或kb)或m(mb)来表示文件大小和相应的处理?,php,forms,Php,Forms,事实上,我正在努力正确地表达这一点 目前我有一个表单,它要求以kb为单位的最小和最大文件大小,但我想尝试的是允许用户通过创建某种规则来决定其最大和最小文件大小,例如: 如果框中没有字母,则将其解释为字节;如果存在k或kb,则以kb解释,同样以mb解释 我认为默认值和出现的任何错误都应该设置为kb,但我只是想在头脑中找出如何实现这一点,任何建议都将不胜感激 <tr> <td class="label">File Size:</td> <td>

事实上,我正在努力正确地表达这一点

目前我有一个表单,它要求以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>

文件大小:

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

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

为了更好的重用性,您可以从中生成一个函数。

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

$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;
  }
} 
您可以利用它制作一个函数,以提高可重用性。

我的尝试:

<?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)
    );
}
我的尝试:

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

当然,您可以使用正则表达式或字符串函数来检测输入中的某些字符串,但是您和用户都可以添加一个或两个选择,用户可以简单地选择单位,并且该值会给您一个乘数,例如最小值:

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

字节
Kb
兆字节

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

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

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

字节
Kb
兆字节

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

我想当有$\u POST['dosearch']时,您之前已经处理过表单,并设置了filesize\u min和filesize\u max。您似乎在问如何进行处理,并将filesize\u 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\u max执行相同的操作。我想,如果有$\u POST['dosearch'],您之前已经处理过表单,并设置了filesize\u min和filesize\u max。您似乎在询问如何进行处理,并将filesize\u 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做同样的操作,你当然可以像Yoshi在回答中那样将所有这些封装在一个函数中,你当然可以像Yoshi在回答中那样将所有这些封装在一个函数中