Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    Espressioni regolari RICORSIVE (anzi, ANNIDATE)

    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!
    Rimon Soliman
    akomi.it

  2. #2
    Scusate il post lungo ma volevo spiegarmi bene...
    Rimon Soliman
    akomi.it

  3. #3
    Se ho capito un po' quello che vuoi fare, a grandi linee una cosa tipo

    Codice PHP:
    while(preg_match(tua_espressione_regolare))
    $testo=preg_replace_calback(tua_espressione_regolare); 
    dovresti modificare la tua espressione regolare in modo che cominci a fare le sostituzioni dal pattern pių interno al pių esterno.
    La cosa che mi viene in mente di provare č una modifica di questo tipo, con la condizione che all'interno delle parentesi tonde pių interne il testo da ripetersi non consenta parentesi tonde:

    Codice PHP:
    // dalla tua 
    $rex"/\\[wf_com:\\((.*?)\\)\\]/s";

    //a questa
    $rex="/\\[wf_com:\\(([^()]+)\\)\\]/"
    Se invece devi consentire anche l'inserimento di parentesi tonde allora bisogna ragionarci un po' su.
    dA .. foto di viaggio
    L'esperienza č il tipo di insegnante pių difficile.
    Prima ti fa l'esame, e poi ti spiega la lezione.

  4. #4
    Credo che basti inserire un controllo che renda NON VALIDA la regexp qualora tra l'apertura
    "[wf_com:"
    e la chiusura
    "\]"
    ci sia la parola "wf_com"

    In questo mono viene riconosciuta sono quella interna. Poi io eseguo la funzione ricorsivamente fino a quando non ci sono piu match, solo che NON SO COME SCRIVERE LA REGEXP.

    Riesci a darmi una dritta?

    Grazie mille del tuo aiuto;
    Rimon Soliman
    akomi.it

  5. #5
    Prova con questa:
    codice:
    $rex="/\[wf_com:\((?![^)]+wf_com:)(.*?)\)\]/s";
    dA .. foto di viaggio
    L'esperienza č il tipo di insegnante pių difficile.
    Prima ti fa l'esame, e poi ti spiega la lezione.

  6. #6

    (RISOLTO)

    PERFETTO!
    Ora si comporta esattamente come volevo: l'espressione regolare "esterna" non viene matchata fino a che quella interna non viene interpretata.

    In questo modo posso annidarle anche a molteplici livelli, parsare tutto con una funzione ricorsiva e MAGIA!

    Ho provato anche ad annidare funzioni diverse e funziona tutto, anche a 3 o 4 livelli di profonditā (per testare la ricorsione).

    GRAZIE MILLE!

    PS. non ho trovato una guida alle REG EXP in grado di spiegarmi il significato di quello che mi hai scritto (forse č per questo che ho dovuto postare per risolvere il mio problema), conosci qualche guida magari scaricabile via PDF alle espressioni regolari che parte dalle basi bsi fino all'uso avanzato (oltre chiaramente a quella giā disponibile qui)?

    Grazie ancora.
    Rimon Soliman
    akomi.it

  7. #7

    Re: (RISOLTO)

    Originariamente inviato da egomorrin
    GRAZIE MILLE!
    PS. non ho trovato una guida alle REG EXP in grado di spiegarmi il significato di quello che mi hai scritto (forse č per questo che ho dovuto postare per risolvere il mio problema), conosci qualche guida magari scaricabile via PDF alle espressioni regolari che parte dalle basi bsi fino all'uso avanzato (oltre chiaramente a quella giā disponibile qui)?
    Grazie ancora.
    base

    avanzato




    @AnĒkin

    E' sempre un piacere vederti all'opera
    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  8. #8
    perfetto grazie mille a tutti di nuovo.
    Rimon Soliman
    akomi.it

  9. #9
    Non sono sicurissimo di aver capito esattamente cosa ti serve, ma a proposito di regex ricorsive, dai un'occhiata a questo codice e dimmi se fa al caso tuo:

    Codice PHP:
    $str "[wf_com:(wf_repeat_string:[wf_com:(wf_repeat_string:[wf_com:(wf_repeat_string:PROVA ,3)],4)],5)]";

    while (
    preg_match("/\\[wf_com:\\(wf_repeat_string:(\\w+\\s?|(?R)),(\\d+)\\)\\]/"$str$matches)) {
        
    print_r($matches);
        
    $str $matches[1];


  10. #10
    @whisher: esaggerato
    dA .. foto di viaggio
    L'esperienza č il tipo di insegnante pių difficile.
    Prima ti fa l'esame, e poi ti spiega la lezione.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.