Visualizzazione risultati 1 fino 5 di 5

Discussione: Recursive pattern in un BBCode parser

  1. #1
    Guest

    Predefinito Recursive pattern in un BBCode parser

    Avendo quest'espressione:
    Codice PHP:
    '#\[center\](.+)\[/center\]#i' => '<span>$1</span>'
    E dovendo parsare un codice simile:
    Codice:
    [center]asd[/center][hr][center]asd[/center]
    Come posso fare in modo che il primo center venga elaborato ed il secondo pure? Attualmente la prima apertura del tag viene elaborata e "chiusa" al secondo tag.


  2. #2
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Devi catturare la stringa con il metodo ungreedy.
    Dopo il quantificatore (sarebbe +, nel tuo caso), aggiungi il punto interrogativo.

    Codice:
    #\[center\](.+?)\[/center\]#i
    Oppure puoi usare il modificatore U (maiuscolo), più utile se vuoi rendere qualsiasi subpattern ungreedy.
    Ultima modifica di javascripter : 17-12-2011 alle ore 19.05.15

  3. #3
    Guest

    Predefinito

    Funziona a metà! Cioè, funziona per quel che ho chiesto, ma mi sono accorto che i sub tag non vengono elaborati, per esempio:
    Codice:
    [quote]Citazione[/quote]
    funziona, ma se scrivessi:
    Codice:
    [quote]Citazione [quote]Citazione 2[/quote][/quote]
    mi verrebbe elaborato solo il PRIMO tag (questo vale anche per altri tag quali le liste per esempio).


  4. #4
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Ho capito, qualcosa del genere dovrebbe andare bene:
    Codice PHP:
    function replace_fn($m) {
    $text = $m[1];

    if(
    strpos($text, '[center]') !== false) {
    $text = replace($text);
    }

    return
    '<span>' . $text . '</span>';
    }

    function
    replace($t) {
    return
    preg_replace_callback('/\[center\](.+)\[\/center\]/i', 'replace_fn', $t);
    }

    echo
    replace('[center]prova1[center]prova2[center]prova3[/center][/center][/center]');

  5. #5
    Guest

    Predefinito

    Non è possibile farlo in un passaggio? Lo chiedo per sapere, perché mi sembra strano.


Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •