Precedente :: Successivo |
Autore |
Messaggio |
Crono Semidio


Registrato: 24/03/05 15:12 Messaggi: 224 Residenza: Trieste
|
Inviato: 27 Ago 2008 12:57 Oggetto: [PHP] estrazione sottostringhe |
|
|
Con una query estraggo da un database una stringa composta nel seguente modo:
(((dati)), ((dati), (dati))) oppure (((dati))) o anche (((dati)), ((dati))) eccetera
in pratica un oggetto definito dalle parentesi () che può contenere un numero variabile di altri oggeti, separati da virgole, anch'essi definiti dalle parentesi () che a loro volta possono contenere un numero variabile di stringhe racchiuse da altre parentesi () e separate da virgole. Le stringhe dati sono composte da una combinazione casuale e di lunghezza variabile di numeri da 0 a 9, punti, trattini e spazi. Io devo estrarre tutte le stringhe e ho pensato di utilizzare la funzione preg_match_all() ma ho grosse difficoltà nel definire l'espressione regolare per la ricerca delle occorrenze nella stringa e mi serve qualcuno con più esperienza che mi dia una mano |
|
Top |
|
 |
SverX Supervisor Macchinisti


Registrato: 25/03/02 12:16 Messaggi: 11806 Residenza: Tokelau
|
Inviato: 28 Ago 2008 10:53 Oggetto: |
|
|
non l'ho mai fatto ma tenterei di estrarre tutte le stringhe 'tagliando via' tutto ciò che non interessa (quindi le parentesi, in primis). Ottenuto quindi un array di stringhe farei un lavoro sulla stringa di partenza cercando una per una le stringhe trovate e valutando alla sua sinistra quante parentesi aperte e quante chiuse si trovano, per capire come ogni stringa sia 'imparentata' con la precedente o la successiva.
E' una analisi molto semplicistica però... se vuoi fare un parser per formule matematiche devi invece lavorare con procedure ricorsive cercando la stringa più interna tra parentesi (abcde), 'tagliarla via' e sostituirla con un'altra stringa e continuare...
Non so quanto sono stato d'aiuto però... ma ci ho provato  |
|
Top |
|
 |
freemind Supervisor sezione Programmazione


Registrato: 04/04/07 21:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 28 Ago 2008 22:53 Oggetto: |
|
|
Rispostina ma sono toppo cotto per andare oltre
Però se hai bisogno solo e soltanto le stringhe data (senza nessuna parentesi) allora secondo me puoi prima di tutto togliere le parentesi dalla stringa di partenza tramite:
Codice: |
<?
// $str è la stringa di partenza
$str=str_replace('(','',$str); // sostituisci in $str le ( con nulla
$str=str_replace(')','',$str); // sostituisci in $str le ) con nulla
/*
ora $str è una stringa con numeri spazi e punti raggruppati e separati da ,
e puoi esploderla in un array usando la , come separatore
*/
$array=explode(',',$str);
// $array è un vettore in cui ogni elemento è una stringa data
?>
|
|
|
Top |
|
 |
Crono Semidio


Registrato: 24/03/05 15:12 Messaggi: 224 Residenza: Trieste
|
Inviato: 29 Ago 2008 09:48 Oggetto: |
|
|
Volevo usare la funzione preg_match_all() per una questione di chiarezza del codice ma ho risolto ugualmente il problema creando funzione che con un paio di cicli for estrae le stringhe dalle parentesi purtroppo quello che ottengo alla fine è un array di stringhe mentre dopo aver scritto il post le mie esigenze sono cambiate e ora ho bisogno di una struttura ad albero che rispecchi la struttura degli oggetti definita con le parentesi.
Esiste un algoritmo che effettui il parsing della stringa e ricostruisca la struttura dell'albero dalle parentesi ? |
|
Top |
|
 |
SverX Supervisor Macchinisti


Registrato: 25/03/02 12:16 Messaggi: 11806 Residenza: Tokelau
|
Inviato: 29 Ago 2008 13:59 Oggetto: |
|
|
Crono ha scritto: | Esiste un algoritmo che effettui il parsing della stringa e ricostruisca la struttura dell'albero dalle parentesi ? |
Conosci le 'viste (in ordine anticipato/posticipato) di un albero' ? Se sì, quello che leggi nella stringa è appunto una vista dove il simbolo "(" indica "scendi nel primo figlio", il simbolo "," indica "vai al fratello" e il simbolo ")" indica "fine figli, risali al padre"... |
|
Top |
|
 |
freemind Supervisor sezione Programmazione


Registrato: 04/04/07 21:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 29 Ago 2008 15:22 Oggetto: |
|
|
Il discorso sulle visite è corretto ma c'è un problemino: php non ha un concetto di struttura o di puntatore quindi gli unici due modi per poter definire l' ADT "albero" è usare i vettori o gli oggetti. Io sono propenso alla seconda perchè raffigurare un albero usando i vettori è una cosa che non mi è mai piaciuta.
Se usi gli oggetti dovrai creare una classe che oltre all'informazione contenuta nella stringa dovrà avere 2 proprietà che indichino il figlio sx e quello dx. |
|
Top |
|
 |
|