从php.ini中的简写字节表示法中获取字节值

时间:2011-07-27 14:53:27

标签: byte php

有没有办法从使用shorthand byte notationini_get('upload_max_filesize')ini_get('post_max_size')等函数返回的字符串中获取字节值?例如从4M获得4194304?我可以将一个函数组合在一起,但如果没有一些内置的方法,我会感到惊讶。

6 个答案:

答案 0 :(得分:25)

The paragraph you linked to结束:

  

您可能不会在php.ini之外使用这些简写符号   使用整数字节值。 请参阅the ini_get() documentation   有关如何转换这些值的示例。

这会引导你做这样的事情(我稍作修改):

function return_bytes($val)
{
    $val  = trim($val);

    if (is_numeric($val))
        return $val;

    $last = strtolower($val[strlen($val)-1]);
    $val  = substr($val, 0, -1); // necessary since PHP 7.1; otherwise optional

    switch($last) {
        // The 'G' modifier is available since PHP 5.1.0
        case 'g':
            $val *= 1024;
        case 'm':
            $val *= 1024;
        case 'k':
            $val *= 1024;
    }

    return $val;
}

使用它like so

echo return_bytes("3M");
// Output: 3145728

没有内置功能来执行此任务;回想一下,实际上,INI设置是为在PHP内部使用内部而设计的。 PHP源使用与上面类似的功能。

答案 1 :(得分:2)

尔加!刚刚在http://www.php.net/manual/en/function.ini-get.php

上找到答案

只需要RTM ......

function return_bytes($val) {
    $val = trim($val);
    $last = strtolower($val[strlen($val)-1]);
    switch($last) {
        // The 'G' modifier is available since PHP 5.1.0
        case 'g':
            $val *= 1024;
        case 'm':
            $val *= 1024;
        case 'k':
            $val *= 1024;
    }

    return $val;
}

答案 2 :(得分:1)

这是我的建议,应该是面向未来的(关于PHP版本7 ++)!

function return_bytes($val, $gotISO = false) {        
    // This is my ultimate "return_bytes" function!
    // Converts (not only) the PHP shorthand notation which is returned by e.g. "ini_get()"
    // Special features:
    // Doesn't need regular expression and switch-case conditionals.
    // Identifies beside "Kilo", "Mega" and "Giga" also "Tera", "Peta", "Exa", "Zetta", and "Yotta" too!
    // Ignores spaces and doesn't make no difference between e.g. "M" or "MB"!
    // By default possible commas (,) as thousand separator will be erased. Example: "1,000.00" will "be 1000.00".
    // If ($gotISO == true) it converts ISO formatted values like "1.000,00" into "1000.00".
    $pwr = 0;
    if(empty($val)) return 0;
    $val  = trim($val);
    if (is_numeric($val)) return $val;
    if ($gotISO) {
        $val = str_replace('.','',$val); // wipe possibe thousend separators (.)
        $val = str_replace(',','.',$val); // convert ISO comma to value point
    } else {
        $val = str_replace(',','',$val); // wipe possibe thousend separators (,)
    }
    $val = str_replace(' ','',$val);
    if (floatval($val) == 0) return 0;
    if (stripos($val, 'k') !== false) $pwr = 1;
        elseif (stripos($val, 'm') !== false) $pwr = 2;
        elseif (stripos($val, 'g') !== false) $pwr = 3;
        elseif (stripos($val, 't') !== false) $pwr = 4;
        elseif (stripos($val, 'p') !== false) $pwr = 5;
        elseif (stripos($val, 'e') !== false) $pwr = 6;
        elseif (stripos($val, 'z') !== false) $pwr = 7;
        elseif (stripos($val, 'y') !== false) $pwr = 8;
    $val *= pow(1024, $pwr);
    return $val;
}

...玩得开心!

答案 3 :(得分:0)

我找到了很多解决这个问题的解决方案,应该有一个内置函数来解决这个问题。在任何情况下,有两件事要强调这个问题:

  1. 这非常特定于PHP的速记字节值,如下所述:http://php.net/manual/en/faq.using.php#faq.using.shorthandbytes并且只应在此上下文中使用。
  2. 大多数现代IDE都会在没有switch的情况下对break语句发出警告。
  3. 这是一个涵盖所有内容的解决方案:

    /**
     * Convert PHP's directive values to bytes (including the shorthand syntax).
     *
     * @param string $directive The PHP directive from which to get the value from.
     *
     * @return false|int Returns the value of the directive in bytes if available, otherwise false.
     */
    function php_directive_value_to_bytes($directive) {
        $value = ini_get($directive);
    
        // Value must be a string.
        if (!is_string($value)) {
            return false;
        }
    
        preg_match('/^(?<value>\d+)(?<option>[K|M|G]*)$/i', $value, $matches);
    
        $value = (int) $matches['value'];
        $option = strtoupper($matches['option']);
    
        if ($option) {
            if ($option === 'K') {
                $value *= 1024;
            } elseif ($option === 'M') {
                $value *= 1024 * 1024;
            } elseif ($option === 'G') {
                $value *= 1024 * 1024 * 1024;
            }
        }
    
        return $value;
    }
    

答案 4 :(得分:0)

我发现,上面显示的版本中的任何一个都不再适用于PHP 7.2x。通过将其用于PHP 7.0 + 7.1,它可以工作,但不适用于PHP7.x。 厄尼

private function return_bytes ($val) {
        if(empty($val))return 0;
        $val = trim($val);
        preg_match('#([0-9]+)[\s]*([a-z]+)#i', $val, $matches);
        $last = '';
        if(isset($matches[2])){
            $last = $matches[2];
        }
        if(isset($matches[1])){
            $val = (int) $matches[1];
        }
        switch (strtolower($last)){
            case 'g':
            case 'gb':  
            $val *= 1024;
            case 'm':
            case 'mb':
            $val *= 1024;
            case 'k':
            case 'kb':
            $val *= 1024;
        }
        return (int) $val;
    }

答案 5 :(得分:-1)

这是一种方式。

$str=ini_get('upload_max_filesize');
preg_match('/[0-9]+/', $str, $match);

echo ($match[0] * 1024 * 1024); // <--This is MB converted to bytes