Visualizzazione risultati 1 fino 5 di 5

Discussione: preg_replace e contenuti obbligatori

  1. #1
    Guest

    Predefinito preg_replace e contenuti obbligatori

    Come scritto nell'altro thread, sto creandomi un BBCode parser e finora funziona quasi al 100%; uno dei pochi problemi che ho riscontrato è il seguente:
    Codice PHP:
    '#\[list(?:="(' . implode('|', $options) . ')")?\](.+?)\[\/list\]#ise'
    In realtà dovrebbe essere:
    Codice PHP:
    '#\[list(?:="(' . implode('|', $options) . ')")?\]((?:\[\*\]+).+?)\[\/list\]#ise'
    ma così scrivendo, quando vado a fare un ciclo per il replace (sono obbligato, nel caso ci siano più liste una dentro l'altra), non me lo esegue, mentre con la prima, si.

    Il mio problema è scrivere la regola in modo che il tag [*] sia OBBLIGATORIO all'interno di [list] per il match ed il replace, altrimenti no.


  2. #2
    Guest

    Predefinito

    Codice PHP:
    $pattern = "#\[list\]((\n|\r\n)?(\[\*\].+?\n)+?)\[/list\]#is";

    $str = ' okokok
    [list][*] uno[*] due[/list]
    '
    ;

    echo
    preg_replace_callback($pattern,
    create_function('$m', '$split=explode("\n",$m[1]); $lis=""; foreach($split as $li): $clean=trim(substr($li, 3)); if (!empty($clean)): $lis.="<li>".$clean."</li>"; endif; endforeach; return "<ul>$lis</ul>";'),
    $str);

    Così è come ne son venuto fuori io qualche tempo fa, spero che qualcuno ti sappia consigliare qualche soluzione più elegante.


    ps: il parser di codice php di altervista toglie i breakline, ma come è intuibile dalla regexp per separare i vari[*] è obbligatorio un br.
    Ultima modifica di blackbos : 28-12-2011 alle ore 13.04.09 Motivo: correzione ortografica

  3. #3
    Guest

    Predefinito

    Purtroppo non funziona nemmeno così.. Non capisco il perché non funzioni se inserisco una lista al suo interno...


  4. #4
    Guest

    Predefinito

    Te l'ho modificato un pochino per fargli leggere anche le sottoliste




    Codice PHP:
    $pattern = "#\
    [list\]((\n|\r\n)?((\[\*\].+?)(\n|\[\*\])?)+?)\[/list\]#is"
    ;


    $r1 = preg_replace_callback($pattern,
    create_function('$m', '$split=explode($m[5],$m[1]); $lis=""; foreach($split as $li): $clean=trim(substr($li, 3)); if (!empty($clean)): $lis.="<li>".$clean."</li>"; endif; endforeach; return "<ul>$lis</ul>";'),
    $str);


    $r2 = preg_replace_callback($pattern,
    create_function('$m', '$split=explode($m[5],$m[1]); $lis=""; foreach($split as $li): $clean=trim(substr($li, 3)); if (!empty($clean)): $lis.="<li>".$clean."</li>"; endif; endforeach; return "<ul>$lis</ul>";'),
    $r1);


    echo
    $r2;

    Output:

    Codice HTML:
    <ul>
    <li>lista 1</li>
    <li><ul><li>sublist 1</li><li>sublist 2</li></ul></li>
    <li>lista 2</li>
    </ul>

    A te poi istituire un criterio per ciclare tot volte il preg_replace_callback quante te ne occorrono per convertire tutte le list.

    L'unica nota importante è rispettare la sintassi, la prima lista deve avere ogni elemento che termina con un breakline (una mandata a capo insomma) mentre nelle sottoliste il primo[*] deve essere attaccato subito dopo il tag list mentre la fine dell'ultimo[*] subito prima della chiusura senza breakline (proprio come nell'immagine insomma).

    Purtroppo usare questa sintassi per le sottoliste è caotico e porta a dover assumere restrizioni sintattiche complesse come in questo caso.

  5. #5
    Guest

    Predefinito

    È totalmente diverso dal sistema che utilizzo e non posso integrarlo in questo modo perché nella classe ho delle opzioni per ogni BBCode e i tag che possono essere multipli (es: quote, list, ecc), sono elaborati con il modifier e per una formattazione corretta.

    Il sistema funziona benissimo, almeno, quello che ho scritto, ma il mio unico problema è far capire che dentro al testo in mezzo a list, ci sia[*], quindi renderlo obbligatorio.

    Sto provandoci, ma non riesco a trovare una soluzione..


Regole di scrittura

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