Newsgroup: it.comp.www.php
Titolo: Aiuto su espressione regolare

Salve a tutti,
non sono molto pratico di espressioni regolare, non a caso, non riesco
a fare una cosa semplice :(
Data una stringa del genere
$stringa = "un pezzo di frase {$value.Primo} altro pezzo di frase
{$value.Secondo}"
vorrei ottenere un array contenente solo "Primo" e "Secondo" ovvero di
qualsiasi parola presente tra "{$value.}" e "{$}".
Mi sapete aiutare?
grazie anticipatamente per le vostre risposte

 Mi sapete aiutare?
no, perchè le due richieste sono diverse, spiegati meglio.


Così com'è quella riga di codice genera un errore:
Parse error: syntax error, unexpected '.', expecting '}'
Il che è ovvio, visto che l'interprete si aspetta la chiusura della
graffa
subito dopo la variabile $value. Cosa ci fa lì quel punto?

On 26 Mar, 17:19, 
nicola1...@tiscalinet.it
 wrote:

Così com'è quel codice genera un errore:
Parse error: syntax error, unexpected '.', expecting '}' in ...
Ed è ovvio, l'interprete non si aspetta un punto dopo una
variabile racchiusa tra graffe, all'interno di una stringa.
La tua richiesta sottintende delle lacune, spiegaci perché
dovresti dichiarare una stringa costruita in quel modo.

 dovresti dichiarare una stringa costruita in quel modo.
Nel mio messaggio iniziale c'è un errore: voglio la parola presente
tra "{$value." e "}" (avevo scritto erroneamente "{$value.}" e
"{$}")).
Ho una stringa del genere in quanto ho creato una classe php per
creare delle tabelle html. Funziona perfettamente, l'unico
inconveniente è che non posso associare degli id (presi da mysql) ad
un elemento presente nella riga della stessa.
Senza questa classe mi sarebbe bastato fare una cosa del genere (non
ho inserito i tag di apertura e chiusura del php nell'html per
comodità):
foreach($datiAnagrafici as $studente){
 ....
 <tr>
 <td><input  type="checkbox" name="stud[ $studente['Id'] ]"  value="
$studente['Id'] " /></td>
 </tr>
 ...
}
Ora, nella mia classe, per dare l'opportunità di aggiungere anche
checkbox/radiobutton/ecc oltre alla semplice visualizzazione dei
risultati di una query ho pensato di fare un qualcosa del genere:
// per popolare il body della data con un array derivante da una query
$phpTable->setBody($datiAnagrafici );
// con questo metodo inserisco nella prima colonna una checkbox per
tutte le righe.
$phpTable->setLeftBodyAll('<input type="checkbox" name="stud
[ {$value.Id} ]" ');
Per poter associare l'id dello studente alla checkbox ho pensato di
utilizzare una sintassi del genere "{$value.Id}" (la stessa dal
template engine RAINTPL/smarty) per poi all'interno del metodo andare
a prendere "Id" -  cioè la parola compresa tra "{$value." e "}" - ed
utilizzarla come variabile in questo modo $datiAnagrafici[$id] ed
ottenere così l'id dello studente.
spero di essere stato abbastanza chiaro

nicol...@tiscalinet.it
 ha scritto:

Hmmm... forse una roba tipo /\{\$value\.(.*?)\}/ potrebbe aiutarti...
Occhio che con questa dovresti usare le funzioni preg*.
La stringa interessata (indicata nella regex tra parentesi) viene
memorizzata nella variabile $1.

 memorizzata nella variabile $1.
grazie per la risposta ho fatto nel seguente modo
$string = '<input type="checkbox" name="stud[{$value.Id]" />';
$reg = "/\{\$value\.(.*?)\}/";
if(preg_match($reg, $frase, $matches, PREG_OFFSET_CAPTURE)){
     print_r($matches);
}
ma niente continua a non trovarmi ciò che cerco :(

 ma niente continua a non trovarmi ciň che cerco :(
manca la chiusura della graffa

 manca la chiusura della graffa
"\}/" non sarebbe questa la chiusura della graffa?

 "\}/" non sarebbe questa la chiusura della graffa?
manca in $string,  la chiusura della graffa



ah è vero..ma non funziona lo stesso



non funziona che significa?
posta codice ed output della preg_match
inoltre non capisco perchè hai impostato  PREG_OFFSET_CAPTURE, toglilo

 inoltre non capisco perchè hai impostato  PREG_OFFSET_CAPTURE, toglilo
mi sono appena accorto che :
preg_match($reg, $frase, $matches, PREG_OFFSET_CAPTURE)
forse dovresti cercare in $string, non in $frase :)


Non funziona nel senso che non trova la corrispondenza.
Sto utilizzando questo semplice codice d'esempio:
$string = '<input type="checkbox" name="stud[{$value.Id}]" />';
$reg = "/\{\$value\.(.*?)\}/";
if(preg_match($reg, $string, $matches)){
	print_r($matches);
} else {
       echo "Non Trovato";
}

 
$string = '<input type="checkbox" name="stud[{$value.Id}]" />';
$reg = "/\{\\\$value\.(.*?)\}/";
il dollaro nella regexp necessita di doppio escape, il primo per dire a
php di non espandere la variabile $value, il secondo per dire alla regexp
di non considerare il $ come un carattere della stringa

 di non considerare il $ come un carattere della stringa
ah, in alternativa avresti potuto mettere un solo escape e gli apici
singoli (che non fanno espandere le varibili al php)
$reg = '/\{\$value\.(.*?)\}/';


ah grazie mille adesso funziona :D.
Un ultimo chiarimento quel "(.*?)" cosa significa esattamente? Non
sarebbe bastato scrivere solo "(.*)" ?

 sarebbe bastato scrivere solo "(.*)" ?
significa "ungreedy", cerca su google