Buon giorno a tutti.
Ho scritto un interprete dei comandi in php in modo da poter eseguire comandi nelle stringhe.
Mi spiego meglio:
tramite l'uso di espressioni regolari riesco a interpretare una stringa fatta cosi:
"io sono [com:(repeat:tanto ,3)] felice"
che diventa
"io sono tanto tanto tanto felice"
Nella stringa d'origine, il testo comando viene poi sostituito dal risultato del comando stesso.
e questo già funziona (l'interprete vero e priprio è una funzione che lavora sui valori restituiti da preg_match_all(); ma il suo comportamento non interessa questo post).
Ora però ho l'esigenza di annidare queste operazioni:
"io sono [com:(repeat:[com:(repeat:tanto ,2)] ,3)] felice"
che diventa
"io sono tanto tanto tanto tanto tanto tanto felice".
Questa è l'espressione regolare che ho usato:
"/\[wf_com:\((.*?)\)\]/s"
Questo è un esempio reale di stringa già FUNZIONANTE:
"Questo è un testo di [wf_com:(wf_repeat_string:prova ,4)]"
che restituisce
"Questo è un testo di prova prova prova prova"
...e questo è un esempio reale di stringa che VORREI FAR FUNZIONARE:
"Questo è un testo di [wf_com:(wf_repeat_string:[wf_com:(wf_repeat_string:PROVA ,4)],4)]"
Chiaramente il risultato dovrebbe essere
"Questo è un testo di prova prova prova....." ("prova" ripetuto 16 volte).
Questo testo contiene 2 volte il testo identificabile dall'espressione ma deve restituire solo quello "interno".
Come posso fare in modo che l'espressione regolare non venga riconosciuta se un'altra espressione regolare della stessa specie è presente al suo interno?
Poi io con una funzione ricorsiva faccio in modo di esaurire tutte le espressioni regolari presenti nel testo, questo chiaramente perchè una espressione regolare che ne contiene un'altra non deve essere trovata fino a che io non interpreto quella interna e la sostituisco con un valore, e così via ciclando fino a che non si esauriscono tutte.
Grazie del vostro aiuto!