Newsgroup: it.comp.www.php
Titolo: Convertire una stringa nelle costanti di PHP

ciao,
ho un problema con queste righe di codice;
function converter($formula){
   $tmp = '$'.'tmp = '.$formula.';';
   eval($tmp);
   return $tmp;
}
$formula = 'E_ALL & ~E_STRICT';
$errorFilter = converter($formula);
vorrei non utilizzare la funzione eval in quanto il contenuto di
$formula  mi arriva dall'esterno
e quindi potrebbe combinare casini
sapete aiutarmi
grazie

 e quindi potrebbe combinare casini
E hai ragione.
Ma e` meglio se spieghi cosa stai cercando di fare.
Bye.

sapete aiutarmi
Che contenuto può avere questa formula? Prova a fare qualche esempio.
Leonardo
-- 
Enough, enough!  But, stranger, ere we part,
Glancing farewell to each nefarious bier,
This warning would I beg you take to heart:
There is an end to e'en the worst career!

 $errorFilter = converter($formula);
Ma se vuoi fare uno switch che decide che tipo di erori visualizzare non ti puoi
basare su un input esterno o sulla presenza di un file per dare un ini_set
anziche' prendere una variabile e passarla a quella mostruosita' di eval()?
esempio1 - File usato come flag
if (is_file('debugflag')) {
	error_reporting( E_ALL );
	ini_set("display_errors", 'on');
} else {
	error_reporting(0);
	ini_set("display_errors", 'off');
}
esempio2 - variabile usata come flag
if ('debug' == $variabile) {
	error_reporting( E_ALL );
	ini_set("display_errors", 'on');
} else {
	error_reporting(0);
	ini_set("display_errors", 'off');
}
In questo modo non prendi un input che viene da non so dove e lo eval()uti, ma
frapponi un minimo di sanificazione.
Ciao,
luigi
-- 
/
+--[Luigi Rosa]--
\
If something appears irrational to you,
you probably don't understand the game


Vi ringrazio per tutte le risposte
per la prima domanda  la formula e esattamente "E_ALL & ~E_STRICT" o
qualunque cosa che riguardi le costanti php degli errori come "E_ERROR
| E_WARNING" e cosi via
mi serve per la configurazione di un log manager configurato tramite
xml
faccio un esempio di file xml
<LogManager>
   <Add name="File" filter="E_ALL & ~E_STRICT" />
   <Add name="Mail" filter ="E_ERROR | E_WARNING" />
</LogManager>
dal parser del file xml recupreo le stringhe dentro filter
e appunto le voglio convertire nella formula che ora creo tramite eval
spero di essere stato un po' più preciso
vi rigrazio ancora per le vostre risposte

| E_WARNING" e cosi via
Allora è semplice. La tua formula è una sequenza di costanti separate
da & o | e opzionalmente precedute da ~, ignorando i whitespace:
	$error = "E_(ALL|STRICT|ERROR|WARNING|NOTICE|SARCAZZI)"
Quindi, con ampio beneficio di inventario,
	function errorFlagsParser($flags_as_text)
	{
		$flags  = 0;
		$error =
"(~{0,1})\\s*E_(ALL|STRICT|ERROR|WARNING|NOTICE|SARCAZZI)";
                if
(!preg_match("/^\\s*$error(\\s*[&\|]\\s*$error)*\\s*$/", $flags_as_text))
			return false;
                $xlat   = array(
                        'E_NOTICE'      => E_NOTICE,
                        'E_ERROR'       => E_ERROR,
                        'E_WARNING'     => E_WARNING,
                        'E_STRICT'      => E_STRICT,
                );
		$elements = explode(' ','| '.trim(implode('
',preg_split('/\\b/', preg_replace('/\\s+/', '', $flags_as_text)))));
		while(count($elements))
		{
			$op     = preg_split('//',
array_shift($elements));
			$uozz   = array_shift($elements);
			$uozz   = $xlat[$uozz]; // Error checking wanted
			if ('~' == $op[2])
				$uozz = ~$uozz;
			switch($op[1])
			{
				case '|':       $flags |= $uozz; break;
				case '&':       $flags &= $uozz; break;
                                //      case '+':       $flags |= $uozz;
break;
			}
                }
		return $flags;
	}
	print sprintf("Value: %08x, expected: %08x\n",
errorFlagsParser("E_ERROR | E_STRICT"), E_ERROR | E_STRICT);
Fammi sapere.
Leonardo S.E.&O.




Ti ringrazio per la soluzione
domani la provo e ti faccio sapere
ciao



ottima soluzione
anche se ho dovuto modificarla poco poco
posto il codice nel caso dovesse servire a qualcun'altro:
function errorFlagsParser($flags_as_text) {
    $flags = 0;
    $error = "(~{0,1})\\s*E_(ERROR|\WARNING|PARSE|NOTICE|CORE_ERROR|".
             "CORE_WARNING|COMPILE_ERROR|COMPILE_WARNING|USER_ERROR|".
             "USER_WARNING|USER_NOTICE|STRICT|RECOVERABLE_ERROR|".
             "DEPRECATED|USER_DEPRECATED|ALL)";
    if
    (!preg_match("/^\\s*$error(\\s*[&\|]\\s*$error)*\\s*$/",
$flags_as_text))
        return false;
    $toErrorArray = array(
        'E_ERROR' => E_ERROR,
        'E_WARNING' => E_WARNING,
        'E_PARSE' => E_PARSE,
        'E_NOTICE' => E_NOTICE,
        'E_CORE_ERROR' => E_CORE_ERROR,
        'E_CORE_WARNING' => E_CORE_WARNING,
        'E_COMPILE_ERROR' => E_COMPILE_ERROR,
        'E_COMPILE_WARNING' => E_COMPILE_WARNING,
        'E_USER_ERROR' => E_USER_ERROR,
        'E_USER_WARNING' => E_USER_WARNING,
        'E_USER_NOTICE' => E_USER_NOTICE,
        'E_STRICT' =>E_STRICT,
        'E_RECOVERABLE_ERROR' => E_RECOVERABLE_ERROR,
        'E_DEPRECATED' => E_DEPRECATED,
        'E_USER_DEPRECATED' => E_USER_DEPRECATED,
        'E_ALL' => E_ALL
    );
    $elements = preg_split('/\\b/', preg_replace('/\\s+/', '',
$flags_as_text));
    if($elements[0]==''){
        array_shift($elements);
    }
    if($elements[count($elements)-1]==''){
        array_pop($elements);
    }
    array_unshift($elements, '|');
    while (count($elements)) {
        $op = preg_split('//', array_shift($elements));
        $value = array_shift($elements);
        if(!empty ($toErrorArray[$value])){
            $value = $toErrorArray[$value];
        }else{
            $error = 'errore'; //qui lancieare un Exception o un
trigger_error
        }
        if ('~' == $op[2])
            $value = ~$value;
        switch ($op[1]) {
            case '|':
                $flags |= $value;
                break;
            case '&':
                $flags &= $value;
                break;
            default:
                $error ='errore'; //qui lancieare un Exception o un
trigger_error
                break;
        }
    }
    return $flags;
}
se ci sono suggerimenti fatemi sapere
comunque grazie a tutti per i vostri contributi
ciao

anche se ho dovuto modificarla poco poco
In effetti, non ero del tutto certo dell'implementazione di quell'ultimo
codice di errore ;-)
Leonardo
