Newsgroup: it.comp.www.php
Titolo: parsing di file testo

salve a tutti,
mi chiedevo come poter fare il parsing di un file di testo, in modo che
alcune stringhe gia' presenti sul file fossero sostituite da dei valori di
una form.
ad esempio potrei avere un file che contiene:
<?php
 $lingua = "italiano";
?>
da sostituire con:
<?php
 $lingua = "inglese";
?>
come posso gestire la cosa, considerato che avrei anche altri diversi
valori da sostituire ad altre variabili?
pensavo di usare preg_replace ma non so se sia la strada giusta ne',
in caso, come/dove andare a piazzare il replace.
qualche idea?
saluti
-- 
bb

 valori di una form.
IIMHO non stai percorrendo la strada giusta, spiega quale e' il tuo
obiettivo finale, e' molto probabile ci siano strade migliori da
percorrere.
-- 
I am what I am, I do what I can
Sei un newbie? Leggi questo 
http://url.repository.biz/go/3C
Vuoi supportarmi? 
http://url.repository.biz/go/3E
Do. Or do not. There is not try.

 percorrere.
piu' o meno devo fare quello che ho scritto... ma non so come :-)
ho la necessita' di intervenire su un file.php sostituendo delle porzioni
di stringhe con altre porzioni di stringhe passate da una form.
dunque, cercare tra delle delimitazioni (delle quali conosco bene la
struttura) e sostituire con un valore di form.
questa stessa cosa l'ho vista in azione con mambo, che usa un file
"configuration.php" dove salva dei valori di variabili (delle quali si
conosce gia' prima il nome) tramite una form: prima ne visualizza i
valori inseriti nei (rispettivi) campi form e poi ne salva i valori
sovrascrivendoli sul solito "configuration.php".
-- 
bb

 piu' o meno devo fare quello che ho scritto... ma non so come :-)
In verita' hai descritto quello che tu pensi sia la soluzione ad una
tua necessita', e non la reale necessita' che ti spinge a fare cio'. Se
tu esponessi la necessita' sarebbe piu' facile.
Ad esempio, se il tuo intento fosse quello di generare un file di
configurazione allora l'utilizzo di preg_replace etc non sarebbe il
piu' opportuno, difatti conosci gia' i nomi delle variabili relative
alla configurazione per cui potresti seguire un approccio come il
seguente:
1. Ricevi da form una serie di variabili:
es. $_POST['username'], $_POST['password'], $_POST['host'],
$_POST['database'].
All'interno del tuo file di configurazione avrai una cosa del genere:
<?php 
define ('DB_USERNAME', 'root');
define ('DB_PASSWORD', '');
define ('DB_HOST', 'localhost');
define ('DB_DATABASE', 'test');
?>
Invece di cercare e sostituire delle stringhe, e' molto piu' efficiente
ricostruire l'intero file visto che conosci esattamente quello che ci
dovrai andare a scrivere.
<?php 
/* configurazione */
$vars2cfg = array ('username' => 'DB_USERNAME',
				   'password' => 'DB_PASSWORD',
				   'host' => 'DB_HOST',
				   'database' => 'DB_DATABASE');
/* codice generazione */
$cfg = "<"."?php\r\n\r\n";
foreach ($vars2cfg as $var => $constant) {
	if (!isset ($_POST[$var])) {
		$_POST[$var] = '';
	}
	// da migliorare con gpc
	$_POST[$var] = addslashes ($_POST[$var]); 
	$cfg .= "\tdefine ('$constant', '" . $_POST[$var] . "');\r\n";
}
$cfg .= "\r\n?".">";
/* fine */
print ("<pre>".htmlentities ($cfg)."</pre>");
?>
<!-- codice di test -->
<form method="post">
<input type="text" name="username">
<input type="text" name="password">
<input type="text" name="host">
<input type="text" name="database">
<input type="submit">
</form>


 dovrai andare a scrivere.
--cut--
ottimo. ti ringrazio moltissimo, soprattutto per la logica d'approccio che
mi interessa forse piu' del resto :-)
una domanda: l'uso delle costanti che vantaggio mi da' rispetto
all'inizializzare una variabile in modo consueto?
-- 
bb

 all'inizializzare una variabile in modo consueto?
Le costanti, oltre ad essere constanti :)


 Le costanti, oltre ad essere constanti :)
ahahahah certo :) ma se le cambio con sta procedura non sono poi
"costanti costanti" :-))
ad esempio, le costanti posso considerarle globali e, per questo,
chiamarle piu' o meno da dove voglio senza specificare:
global $var1, $var2
come sto (probabilmente sbagliando) facendo da una settimana? :P
-- 
bb

 Le costanti, oltre ad essere constanti :)
Sorry, sono anche globali, per cui accessibili a tuttii livelli.
Personalmente o utilizzo delle costanti oppure un array che contiene
tutta la configurazione.
Un soluzione scalabile che ho trovato e' la seguente:
<?php 
define ('CONFIG_VAR', 'cfg');
$CONFIG_VAR = array ("my settings");
print_r ($CONFIG_VAR);
?>
Ovviamente utilizzando dove serve global $CONFIG_VAR.
In questo modo puoi cambiare il nome del file di configurazione in un
unico posto ed avere tutto il sistema funzionante. Utile sopratutto se
devi integrare il tuo sistema con altri script con cui potresti avere
problemi di conflitto tra i nomi delle variabili.


 In questo modo puoi cambiare il nome del file di configurazione in un
Intendevo "puoi cambiare il nome DELLA VARIABILE di configurazione".


 Intendevo "puoi cambiare il nome DELLA VARIABILE di configurazione".
ottimo bis!
:-)
grazie di nuovo, mi cambio subito tutte le stra-dannatissime...
global $var
....inappropriate ;-)
-- 
bb

 all'inizializzare una variabile in modo consueto?
La prima cosa che mi viene in mente (ma non ho mai testato) e` che le
costanti non le puoi sovrascrivere per errore (magari in un file incluso
o in una funzione definita chissadove).
Bye.

 
Perchè non usi il Singleton? Qualche motivo particolare?

 o in una funzione definita chissadove).
umh.... in che senso "sovrascrivere per errore" ?

 Perchè non usi il Singleton? Qualche motivo particolare?
Singleton e' un pattern OO, volendo utilizzare un oggetto come punto di
accesso per la configurazione potrebbe essere una buona soluzione.


 
Vero, ma visto che viene quasi sempre utilizzato staticamente potresti 
anche utilizzarlo con una semplice funzione, tipo:
function &ConfigArray(){
	static $values = array([qui vanno i parametri]);
	return $values;
}
oppure riscrivere la funzione in modo da andare a beccare qualche 
parametri specifico, tipo:
$db_password = ConfigArray('db', 'password');


Mi sono scordato di dire: La trovo una soluzione migliore delle 
variabili globali perchè nemmeno accidentalmente è possibile 
sovrascrivere o cancellare i dati contenuti nella funzione; è migliore 
delle costanti perchè il codice è "raggruppato" e non disperso in 
singole unità. Inoltre si evitano anche potenziali conflitti di nomi se 
si includono script "esterni".

 conflitti di nomi se si includono script "esterni".
C'e' solo un piccolo overhead derivante dalla chiamata della funzione,
comunque e' una ottima soluzione.


 
Vero.

 umh.... in che senso "sovrascrivere per errore" ?
Metti che in db.php hai dichiarato
$DB = "nomedatabase";
poi in index.php fai
include("db.php");
$DB = mysql_connect("... database=$DB...");
e puff, ti sei giocato il nome del database sovascrivendolo con un
resource id :)
E` un caso limite, ma con pagine complesse, con tanti include e magari
funzioni, classi e altro, una svista puo` capitare.
Bye.

 funzioni, classi e altro, una svista puo` capitare.
allora di sicuro capitera' a me :-)))
-- 
bb

posso chiedere due cose? :-)
1) franco scrive "function &ConfigArray": cosa significa la & commerciale ?
2) dato che sono in procinto di usare le costanti, qualche anima pia mi
spiega che cos'e' il singleton e come/quando lo si puo' utilizzare?
sono esigente :-)
-- 
bb

 si puo' utilizzare?
http://www.phppatterns.com/index.php/article/articleview/6/1/1/
http://setecastronomy.stufftoread.com/go.php?ID=45
 (la mia
implementazione in PHP4)
E' un pattern creazionale che permette di avere una classe con una sola
istanza ed avere un punto di accesso globale per tale istanza.
Nella soluzione proposta da Franco, invece di avere una istanza di una
classe abbiamo un array di configurazione, ma il concetto base e' lo
stesso.


 e come/quando lo si puo' utilizzare?
http://phppatterns.com/index.php/article/articleview/6/1/1/

 di stringhe con altre porzioni di stringhe passate da una form.
Ritornando al primo esempio che hai fatto, scriverei piuttosto:
<?php
 $lingua=$_POST['lingua']   // se passi il valore tramite post;
?>
Al limite, puoi implementare un controllo per l'impostazione della lingua di
default, scrivendo:
<?php
 $lingua=(isset($_POST['lingua'])?$_POST['lingua']:"italiano");
?>
se italiano, è per esempio, la lingua di default.
-- 
Ciao,
 Fabrizio
=== 
http://www.negusweb.it
 ===