Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    867

    Replace tipo bbcode con espressione regolare

    Ciao a tutti,
    dopo tante ore si smanettamento pensavo di maneggiare decentemente le espressioni regolari, pero' adesso mi trovo davanti ad un problema che mi ha fatto cambiare idea.

    Vi posto una funzione che ho estratto da una piu' grossa per esporvi il problema:
    Codice PHP:
    function parseText($testo)
    {
        
    $pattern "/\[span=([a-z0-9\-]+)\]([^\[\]]+)\[\/span\]/";
        
    $pattern "/\[span=([a-z0-9\-]+)\]([^\[\]]+)\[\/span\]/";
        
    $replacement"<span class=\"\$1\">\$2</span>";
        
    $testo preg_replace($pattern,$replacement,$testo);
        return 
    $testo;
    }

    echo 
    parseText("[span=testo-italico][span=testo-grassetto]Prova doppio tag[/span][/span]"); 
    In pratica rimpiazza tutti gli
    Codice PHP:
    [span=testo-italico]aaaa[/span
    con
    Codice PHP:
    <span=testo-italico>aaaa</span
    Pero' come potete provare con l'esempio se ho due tag annidati non funziona, sapete suggerirmi la strada corretta ?

    Grazie

    No pvt per sollecitare risposte, grazie.

  2. #2

    Re: Replace tipo bbcode con espressione regolare

    Aggiungi un lookahead negativo!
    In questo modo dovrebbe funzionare

    Codice PHP:
       $pattern "/\[span=([a-z0-9-]+)\]([^\[\]]+)(?!\[\/span\])\[\/span\]/"
    Occhio che non si vedono i caratteri backslashati..
    In realta' e' cosi

    $pattern = "/\[span=([a-z0-9-]+)\]([^\[\]]+)(?!\[\/span\])\[\/span\]/";

    Ciao

    ----

    Oooops ho preso un abbaglio.. in realta' non funziona sorry :P

  3. #3
    Eccolo..
    io di solito quando si parla di strutture annidate me la cavo cosi'.
    Sarebbe carino pero' sapere se c'e' modo di mettere tutto in una regex.

    Codice PHP:
    <?
    function parseText($testo
    {
        
    $replacedTesto '';
        
    $pattern "/\[span=([a-z0-9-]+)\](.+)\[\/span\]/";
        
    $replacement"<span class=\"\$1\">\$2</span>";

        while ( 
    ) {
          
    $replacedTesto preg_replace($pattern,$replacement,$testo);
          if ( 
    $replacedTesto == $testo ) {
            break;
          }
          
    $testo $replacedTesto;
        }

        return 
    $replacedTesto;


    echo 
    parseText("[span=testo-italico][span=testo-grassetto]Prova doppio tag[/span][/span]");
    ?>
    Ciao ciao

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    867
    Originariamente inviato da El Pedro
    Eccolo..
    io di solito quando si parla di strutture annidate me la cavo cosi'.
    Sarebbe carino pero' sapere se c'e' modo di mettere tutto in una regex.
    Esatto, hai perfettamente compreso quello che intendevo, se fosse possibile preferirei evitare di dover ciclare e far ripetere la stessa regexp.
    In ogni caso ti ringrazio per il contributo ed attendo di vedere se qualcuno sa darci una dritta nella direzione desiderata.

    Ciao ciao
    No pvt per sollecitare risposte, grazie.

  5. #5
    Ciao spero di aver capito bene il problema,

    mi sono trovato anche io nella tua situazione e quando ricevo dati da una text area o campo di testo utilizzo una funzione che man mano sto arricchendo.

    invece dell'espressione regolare utilizzo str_replace() e non mi ha mai dato problemi con tag annidati

    ti faccio un esempio molto stupido

    Codice PHP:
    $testo str_replace("[BOLD]","[b]",$programma); 
    $testo str_replace("[/BOLD]","[/b]",$programma); 

    per fare quello che ti serve potresti provare a fare così

    Codice PHP:
    $testo=str_replace("[span=$testo]","<span=$testo>",$testo);
    $testo=str_replace("$testo[/span]","$testo</span>",$testo); 
    spero di aver bene inteso quello che ti serve

    Ciao

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    867
    Ti ringrazio,
    ma i tag che devo sostituire sono molteplici e l'espressione regolare mi serve proprio per evitare di fare un replace per ogni tag, inoltre gli span contengono delle classi che derivano da un css quindi facendo come dici tu dovrei andare a modificare il codice php ogni volta che aggiungo o tolgo una classe dal css.

    In ogni caso grazie del contributo anche a te.

    Ciao ciao
    No pvt per sollecitare risposte, grazie.

  7. #7
    Rieccoci,
    ti consiglio di dare un occhio al manuale di PHP per quel che riguarda le preg

    http://de3.php.net/manual/en/referen...ern.syntax.php

    In fondo c'e' un capitolo sui recursive patterns, ho scoperto esiste un partilocare identificatore (?R) che dovrebbe fare al caso tuo.
    Se risolvi posta la soluzione che sono interessato!

    Ciao

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    867
    Originariamente inviato da El Pedro
    Rieccoci,
    ti consiglio di dare un occhio al manuale di PHP per quel che riguarda le preg

    http://de3.php.net/manual/en/referen...ern.syntax.php

    In fondo c'e' un capitolo sui recursive patterns, ho scoperto esiste un partilocare identificatore (?R) che dovrebbe fare al caso tuo.
    Se risolvi posta la soluzione che sono interessato!

    Ciao
    Sono pefettamente al corrente dell'esistenza di quel modificatore, solo che non riescoa capire come funziona, è per quello che ho postato sul forum.

    Qualcuno ha qualche suggerimento ?

    Gazie
    No pvt per sollecitare risposte, grazie.

  9. #9
    Utente di HTML.it L'avatar di zoom
    Registrato dal
    Dec 2001
    Messaggi
    1,737
    sei poi riuscito a risolvere?
    anche io sto cercando di sostituire i tag html (anche annidati) con dei relativi simil BBcode...
    e anche io vorrei evitare se possibile di fare un ciclo...
    Chicco Ravaglia per sempre con noi!

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    867
    Originariamente inviato da zoom
    sei poi riuscito a risolvere?
    anche io sto cercando di sostituire i tag html (anche annidati) con dei relativi simil BBcode...
    e anche io vorrei evitare se possibile di fare un ciclo...
    Alla fine avevo optanto per usare "temporaneamente" il ciclo, in attesa di avere un po' di tempo per rianalizzare la questione. Purtroppo sono sommerso dal lavoro e quindi la rimozione del ciclo e' ancora nell'elenco dei buoni propositi

    In ogni caso, visto che hai riuppato il thread, vediamo se qualcun altro sa darci ulteriori lumi, soprattutto sul modificatore ricorsivo (?R).

    No pvt per sollecitare risposte, grazie.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.