Generalizzazione della gestione stringhe

Miglioramento della gestione delle stringhe con pattern personalizzati.
Possibile soluzione alla issue #180 e ai relativi problemi con la generazione dei numeri consecutivi.
This commit is contained in:
Thomas Zilio 2018-03-19 15:30:16 +01:00
parent fbd053c39b
commit 038c9e767b
4 changed files with 150 additions and 61 deletions

View File

@ -24,7 +24,7 @@ function redirect($url, $type = 'php')
/**
* Verifica e corregge il nome di un file.
*
* @param unknown $filename
* @param string $filename
*
* @return mixed
*/
@ -162,7 +162,7 @@ function create_zip($source, $destination, $ignores = [])
/**
* Controllo dei file zip e gestione errori.
*
* @param unknown $zip_file
* @param string $zip_file
*
* @return string|bool
*/
@ -390,8 +390,8 @@ function get_next_code($str, $qty = 1, $mask = '')
/**
* Verifica che il nome del file non sia già usato nella cartella inserita, nel qual caso aggiungo un suffisso.
*
* @param unknown $filename
* @param unknown $dir
* @param string $filename
* @param string $dir
*
* @return string
*/
@ -410,9 +410,9 @@ function unique_filename($filename, $dir)
/**
* Crea le thumbnails di $filename da dentro $dir e le salva in $dir.
*
* @param unknown $tmp
* @param unknown $filename
* @param unknown $dir
* @param string $tmp
* @param string $filename
* @param string $dir
*
* @return bool
*/
@ -452,7 +452,7 @@ function create_thumbnails($tmp, $filename, $dir)
/**
* Ottiene l'indirizzo IP del client.
*
* @return string|unknown
* @return string
*/
function get_client_ip()
{

View File

@ -86,7 +86,7 @@ if (file_exists($backup_dir)) {
$name = basename($backup);
$info = Backup::readName($backup);
$data = $info['Y'].'-'.$info['m'].'-'.$info['d'];
$data = $info['YYYY'].'-'.$info['m'].'-'.$info['d'];
$ora = $info['H'].':'.$info['i'].':'.$info['s'];
echo '
@ -126,7 +126,7 @@ if (file_exists($backup_dir)) {
$name = basename($backup);
$info = Backup::readName($backup);
$data = $info['Y'].'-'.$info['m'].'-'.$info['d'];
$data = $info['YYYY'].'-'.$info['m'].'-'.$info['d'];
$ora = $info['H'].':'.$info['i'].':'.$info['s'];
echo '

View File

@ -8,23 +8,11 @@
class Backup
{
/** @var string Pattern per i nomi dei backup */
const PATTERN = 'OSM backup Y-m-d H_i_s';
/** @var array Elenco delle varabili da sostituire nel pattern */
protected static $replaces = [
'Y' => [
'regex' => '([0-9]{4})',
],
'm' => [],
'd' => [],
'H' => [],
'i' => [],
's' => [],
];
const PATTERN = 'OSM backup YYYY-m-d H_i_s';
/** @var array Elenco delle varabili che identificano i backup giornalieri */
protected static $daily_replaces = [
'Y', 'm', 'd',
'YYYY', 'm', 'd',
];
/**
@ -97,19 +85,7 @@ class Backup
*/
protected static function getReplaces()
{
$replaces = self::$replaces;
foreach ($replaces as $key => $value) {
if (!isset($replaces[$key]['value'])) {
$replaces[$key]['value'] = date($key);
}
if (!isset($replaces[$key]['regex'])) {
$replaces[$key]['regex'] = '(.{'.strlen($replaces[$key]['value']).'})';
}
}
return $replaces;
return Util\Generator::getReplaces();
}
/**
@ -119,13 +95,7 @@ class Backup
*/
protected static function getNextName()
{
// Costruzione del pattern
$replaces = self::getReplaces();
$values = array_column($replaces, 'value');
$pattern = str_replace(array_keys($replaces), array_values($values), self::PATTERN);
return $pattern;
return Util\Generator::generate(self::PATTERN);
}
/**
@ -135,23 +105,7 @@ class Backup
*/
public static function readName($string)
{
// Costruzione del pattern
$replaces = self::getReplaces();
$values = array_column($replaces, 'regex');
$pattern = str_replace(array_keys($replaces), array_values($values), self::PATTERN);
// Individuazione dei valori
preg_match('/^'.$pattern.'/', basename($string), $m);
$keys = array_keys($replaces);
$results = [];
for ($i = 1; $i < count($m); ++$i) {
$results[$keys[$i - 1]] = $m[$i];
}
return $results;
return Util\Generator::read(self::PATTERN, basename($string));
}
/**

135
src/Util/Generator.php Normal file
View File

@ -0,0 +1,135 @@
<?php
namespace Util;
/**
* Classe dedicata alla gestione e all'interpretazione delle stringhe personalizzate.
*
* @since 2.3
*/
class Generator
{
/** @var array Elenco delle varabili da sostituire nel pattern */
protected static $replaces = [
'YYYY' => [
'date' => 'Y',
],
'yy' => [
'date' => 'y',
],
'm' => [
'date' => 'm',
],
'd' => [
'date' => 'd',
],
'H' => [
'date' => 'H',
],
'i' => [
'date' => 'i',
],
's' => [
'date' => 'd',
],
];
/**
* Predispone la struttura per il salvataggio dei contenuti INI a partire da una struttura precedente.
*
* @param string $pattern
* @param string $last
* @param array|int $quantity
*
* @return string
*/
public static function generate($pattern, $last = null, $quantity = 1)
{
// Costruzione del pattern
$replaces = self::getReplaces();
$regexs = array_column($replaces, 'regex');
$result = self::complete($pattern);
$length = substr_count($result, '#');
// Individuazione dei valori precedenti
$previous = self::read($pattern, $last);
$number = 1;
if (isset($previous['number'])) {
$number = intval($previous['number']) + $quantity;
}
$result = preg_replace('/#{1,}/', str_pad($number, $length, '0', STR_PAD_LEFT), $result);
return $result;
}
/**
* Completa un determinato pattern con le informazioni di base.
*
* @return string
*/
protected static function complete($pattern)
{
// Costruzione del pattern
$replaces = self::getReplaces();
$values = array_column($replaces, 'value');
$result = str_replace(array_keys($replaces), array_values($values), $pattern);
return $result;
}
/**
* Restituisce i valori utilizzati sul pattern.
*
* @return array
*/
public static function read($pattern, $string)
{
// Costruzione del pattern
$replaces = self::getReplaces();
$replaces['#'] = [
'regex' => '(?<number>[0-9]+)',
];
$values = array_column($replaces, 'regex');
$pattern = preg_replace('/#{1,}/', '#', $pattern);
$pattern = preg_quote($pattern, '/');
$pattern = str_replace(array_keys($replaces), array_values($values), $pattern);
// Individuazione dei valori
preg_match('/^'.$pattern.'/', $string, $m);
return array_filter($m, 'is_string', ARRAY_FILTER_USE_KEY);
}
/**
* Restituisce l'elenco delle variabili da sostituire normalizzato per l'utilizzo.
*
* @return array
*/
public static function getReplaces()
{
$replaces = self::$replaces;
foreach ($replaces as $key => $value) {
if (!isset($replaces[$key]['value'])) {
if (isset($replaces[$key]['date'])) {
$replaces[$key]['value'] = date($replaces[$key]['date']);
} else {
$replaces[$key]['value'] = $key;
}
}
if (!isset($replaces[$key]['regex'])) {
$replaces[$key]['regex'] = '(?<'.preg_quote($key).'>.{'.strlen($replaces[$key]['value']).'})';
}
}
return $replaces;
}
}