199 lines
4.4 KiB
PHP
199 lines
4.4 KiB
PHP
<?php
|
|
/**
|
|
* @package FrameworkOnFramework
|
|
* @subpackage utils
|
|
* @copyright Copyright (C) 2010-2016 Nicholas K. Dionysopoulos / Akeeba Ltd. All rights reserved.
|
|
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
|
*/
|
|
|
|
defined('F0F_INCLUDED') or die;
|
|
|
|
/**
|
|
* A utility class to parse INI files. This monstrosity is only required because some impossibly misguided individuals
|
|
* who misrepresent themselves as hosts have disabled PHP's parse_ini_file() function for "security reasons". Apparently
|
|
* their blatant ignorance doesn't allow them to discern between the innocuous parse_ini_file and the _potentially_
|
|
* dangerous ini_set functions, leading them to disable the former and let the latter enabled. In other words, THIS
|
|
* CLASS IS HERE TO FIX STUPID.
|
|
*/
|
|
class F0FUtilsIniParser
|
|
{
|
|
/**
|
|
* Parse an INI file and return an associative array.
|
|
*
|
|
* @param string $file The file to process
|
|
* @param bool $process_sections True to also process INI sections
|
|
*
|
|
* @return array An associative array of sections, keys and values
|
|
*/
|
|
public static function parse_ini_file($file, $process_sections, $rawdata = false)
|
|
{
|
|
$isMoronHostFile = !function_exists('parse_ini_file');
|
|
$isMoronHostString = !function_exists('parse_ini_string');
|
|
|
|
if ($rawdata)
|
|
{
|
|
if ($isMoronHostString)
|
|
{
|
|
return self::parse_ini_file_php($file, $process_sections, $rawdata);
|
|
}
|
|
else
|
|
{
|
|
return parse_ini_string($file, $process_sections);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ($isMoronHostFile)
|
|
{
|
|
return self::parse_ini_file_php($file, $process_sections);
|
|
}
|
|
else
|
|
{
|
|
return parse_ini_file($file, $process_sections);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* A PHP based INI file parser.
|
|
*
|
|
* Thanks to asohn ~at~ aircanopy ~dot~ net for posting this handy function on
|
|
* the parse_ini_file page on http://gr.php.net/parse_ini_file
|
|
*
|
|
* @param string $file Filename to process
|
|
* @param bool $process_sections True to also process INI sections
|
|
* @param bool $rawdata If true, the $file contains raw INI data, not a filename
|
|
*
|
|
* @return array An associative array of sections, keys and values
|
|
*/
|
|
static function parse_ini_file_php($file, $process_sections = false, $rawdata = false)
|
|
{
|
|
$process_sections = ($process_sections !== true) ? false : true;
|
|
|
|
if (!$rawdata)
|
|
{
|
|
$ini = file($file);
|
|
}
|
|
else
|
|
{
|
|
$file = str_replace("\r", "", $file);
|
|
$ini = explode("\n", $file);
|
|
}
|
|
|
|
if (count($ini) == 0)
|
|
{
|
|
return array();
|
|
}
|
|
|
|
$sections = array();
|
|
$values = array();
|
|
$result = array();
|
|
$globals = array();
|
|
$i = 0;
|
|
foreach ($ini as $line)
|
|
{
|
|
$line = trim($line);
|
|
$line = str_replace("\t", " ", $line);
|
|
|
|
// Comments
|
|
if (!preg_match('/^[a-zA-Z0-9[]/', $line))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
// Sections
|
|
if ($line{0} == '[')
|
|
{
|
|
$tmp = explode(']', $line);
|
|
$sections[] = trim(substr($tmp[0], 1));
|
|
$i++;
|
|
continue;
|
|
}
|
|
|
|
// Key-value pair
|
|
$lineParts = explode('=', $line, 2);
|
|
if (count($lineParts) != 2)
|
|
{
|
|
continue;
|
|
}
|
|
$key = trim($lineParts[0]);
|
|
$value = trim($lineParts[1]);
|
|
unset($lineParts);
|
|
|
|
if (strstr($value, ";"))
|
|
{
|
|
$tmp = explode(';', $value);
|
|
if (count($tmp) == 2)
|
|
{
|
|
if ((($value{0} != '"') && ($value{0} != "'")) ||
|
|
preg_match('/^".*"\s*;/', $value) || preg_match('/^".*;[^"]*$/', $value) ||
|
|
preg_match("/^'.*'\s*;/", $value) || preg_match("/^'.*;[^']*$/", $value)
|
|
)
|
|
{
|
|
$value = $tmp[0];
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ($value{0} == '"')
|
|
{
|
|
$value = preg_replace('/^"(.*)".*/', '$1', $value);
|
|
}
|
|
elseif ($value{0} == "'")
|
|
{
|
|
$value = preg_replace("/^'(.*)'.*/", '$1', $value);
|
|
}
|
|
else
|
|
{
|
|
$value = $tmp[0];
|
|
}
|
|
}
|
|
}
|
|
$value = trim($value);
|
|
$value = trim($value, "'\"");
|
|
|
|
if ($i == 0)
|
|
{
|
|
if (substr($line, -1, 2) == '[]')
|
|
{
|
|
$globals[$key][] = $value;
|
|
}
|
|
else
|
|
{
|
|
$globals[$key] = $value;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (substr($line, -1, 2) == '[]')
|
|
{
|
|
$values[$i - 1][$key][] = $value;
|
|
}
|
|
else
|
|
{
|
|
$values[$i - 1][$key] = $value;
|
|
}
|
|
}
|
|
}
|
|
|
|
for ($j = 0; $j < $i; $j++)
|
|
{
|
|
if ($process_sections === true)
|
|
{
|
|
if (isset($sections[$j]) && isset($values[$j]))
|
|
{
|
|
$result[$sections[$j]] = $values[$j];
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (isset($values[$j]))
|
|
{
|
|
$result[] = $values[$j];
|
|
}
|
|
}
|
|
}
|
|
|
|
return $result + $globals;
|
|
}
|
|
}
|