php e bbcode

ciao a tutti, essendo un novizio sia di php che del forum, mi appoggio al vostro misericordioso aiuto. Vorrei modificare un codice php il quale provvede a convertire i tag bbcode in tag HTML. In tutto l'ambaradam di codice presumo che la funzione che si occupa di questo è la seguente:

function parseCode($news)
{
  global $Settings;

  /* Parse the BBCode */
  if($Settings['enablebbcode'] == 1)
  {
    // Search for this...
    $replacewhat = array(
                         '/\[url\](.+?)\[\/url\]/is',
                         '/\[url=(.+?)\](.+?)\[\/url\]/is',

                         '/\[ftp\](.+?)\[\/ftp\]/is',
                         '/\[ftp=(.+?)\](.+?)\[\/ftp\]/is',

                         '/\[b\](.+?)\[\/b\]/is',
                         '/\[i\](.+?)\[\/i\]/is',
                         '/\[u\](.+?)\[\/u\]/is',
                         '/\[del\](.+?)\[\/del\]/is',

                         '/\[img\](.+?)\[\/img\]/i',
                         '/\[img width=([0-9]+) height=([0-9]+)\s*\](.+?)\[\/img\]/i',
                         '/\[img width=([0-9]+)\s*\](.+?)\[\/img\]/i',
                         '/\[img height=([0-9]+) width=([0-9]+)\s*\](.+?)\[\/img\]/i',
                         '/\[img height=([0-9]+)\s*\](.+?)\[\/img\]/i',

                         '/\[email\](.+?)\[\/email\]/is',
                         '/\[email=(.+?)\](.+?)\[\/email\]/is',
                         '/(\/|=|"mailto:)?([a-z0-9_-][a-z0-9\._-]*@[a-z0-9_-]+(\.[a-z0-9_-]+)+)(\/|<)?/eis',
                         );

    // ...and replace it with this
    $replacewith = array(
                         '<a href="\\1">\\1</a>',
                         '<a href="\\1">\\2</a>',
                         '<a href="\\1">\\1</a>',
                         '<a href="\\1">\\2</a>',

                         '<b>\\1</b>',
                         '<i>\\1</i>',
                         '<u>\\1</u>',
                         '<del>\\1</del>',

                         '<img src="\\1" alt="" />',
                         '<img src="\\3" alt="" width="\\1" height="\\2" />',
                         '<img src="\\2" alt="" width="\\1" />',
                         '<img src="\\3" alt="" width="\\2" height="\\1" />',
                         '<img src="\\2" alt="" height="\\1" />',

                         '<a href="mailto:\\1">\\1</a>',
                         '<a href="mailto:\\1">\\2</a>',
                         "('\\4' == '' && '\\1' == '' ? '<a href=\"mailto:\\2\">\\2</a>' : stripslashes('\\1\\2\\4'))",
                         );

    $news = preg_replace($replacewhat, $replacewith, $news);
  }

come dicevo, mi piacerebbe implementare anche altri tag bbcode come ad esempio

  • la possibilità di cambiare colore al testo
  • la possibilità di creare una lista (ordinata o non ordinata)

e tutte le alltre funzionalità dei BBCode.

Chi mi aiuterebbe a capire la sintassi della funzione sopra citata e come poterla modificare secondo la mia descrizione?

Grazie 1000

inviato 10 anni fa
mariusart
X 0 X

L'operazione non è immediata se non conosci le espressioni regolari, argomento che non si può spiegare in quattro righe...

Il codice che hai riportato fa uso della funzione preg_replace che effettua delle "sostituzioni" allinterno di $news di parti di stringe definite dall'array $replacewhat con altre stringe presenti nelll'array $replacewith.

La sostituzione avviene proprio impiegando le espressioni regolari, un metodo per definire pattern composti da sequenze di caratteri che seguono una determinata logica. Ciascuna stringa presente nell'array $replacewhat contiente la logica di ricerca mentre le stringhe presenti nelll'array $replacewith contengono il testo con cui rimpiazzare le sequenze di caratteri identificate da $replacewhat.

Ti consiglio di cercare qualche tutorial sulle espressioni regolari prima di provare a decifrare lo script in questione.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Grazie Gianni per il tuo risconto.

ahimè non trovato nessun tutorial che mi aiutasse a capire realmente come "operare" nel mio caso.

ti chiedo gentilmente di inviarmi qualche link o qualche soluzione utile a risolvere il mio problema.

Infinite grazie

risposto 10 anni fa
mariusart
X 0 X

ancora ciao Gianni...ti ringrazio ancora una volta per il tutorial inviatomi.

ho fatto una prima prova ma non ho raggiunto nessun risultato; :'(  volevo capirealmeno se stavo proseguendo per la starda giusta: ti posto la parte di codice da me scritta (premetto che quello che vorrei adesso è cambiare il colore del testo)

//in $replacewhat = array( ho inserito...


'/\[color=[[:xdigit:]]\]\[\/color\]/is',


// in $replacewith = array(

'<font color="\\1"></font>',

dove sbaglio??

grazie per l'aiuto

risposto 10 anni fa
mariusart
X 0 X

Prova con:

'/\[color=(.+?)\](.+?)\[\/color\]/is',

e

'<font color="\\1">\\2</font>',

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

cos'è IS alla fine?

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X
risposto 10 anni fa
Gianni Tomasicchio
modificato 10 anni fa
X 0 X

comunque, o non ho identificato bene la funzione che provvede a "sostituire" il BBCode in codice HTML, o continuo a sbagliare in qualcosa...ma non funziona ancora! :'(

il vosto aito è stato comunque utile a conoscere ed imparare qualcosa di nuovo! Grazie

risposto 10 anni fa
mariusart
X 0 X

riporta il codice della funzione con la modifica che hai effettuato

risposto 10 anni fa
Gianni Tomasicchio
X 0 X
if($Settings['enablebbcode'] == 1)
  {
    // Search for this...
    $replacewhat = array(
                         '/\[url\](.+?)\[\/url\]/is',
                         '/\[url=(.+?)\](.+?)\[\/url\]/is',

                         '/\[ftp\](.+?)\[\/ftp\]/is',
                         '/\[ftp=(.+?)\](.+?)\[\/ftp\]/is',

                         '/\[b\](.+?)\[\/b\]/is',
                         '/\[i\](.+?)\[\/i\]/is',
                         '/\[u\](.+?)\[\/u\]/is',
                         '/\[del\](.+?)\[\/del\]/is',
                   
                    '/\[color=(.+?)\](.+?)\[\/color\]/is',

                         '/\[img\](.+?)\[\/img\]/i',
                         '/\[img width=([0-9]+) height=([0-9]+)\s*\](.+?)\[\/img\]/i',
                         '/\[img width=([0-9]+)\s*\](.+?)\[\/img\]/i',
                         '/\[img height=([0-9]+) width=([0-9]+)\s*\](.+?)\[\/img\]/i',
                         '/\[img height=([0-9]+)\s*\](.+?)\[\/img\]/i',

                         '/\[email\](.+?)\[\/email\]/is',
                         '/\[email=(.+?)\](.+?)\[\/email\]/is',
                         '/(\/|=|"mailto:)?([a-z0-9_-][a-z0-9\._-]*@[a-z0-9_-]+(\.[a-z0-9_-]+)+)(\/|<)?/eis',
                         );

    // ...and replace it with this
    $replacewith = array(
                         '<a href="\\1">\\1</a>',
                         '<a href="\\1">\\2</a>',
                         '<a href="\\1">\\1</a>',
                         '<a href="\\1">\\2</a>',

                         '<b>\\1</b>',
                         '<i>\\1</i>',
                         '<u>\\1</u>',
                         '<del>\\1</del>',
                   
                   '<font color="\\1">\\2</font>',

                         '<img src="\\1" alt="" />',
                         '<img src="\\3" alt="" width="\\1" height="\\2" />',
                         '<img src="\\2" alt="" width="\\1" />',
                         '<img src="\\3" alt="" width="\\2" height="\\1" />',
                         '<img src="\\2" alt="" height="\\1" />',

                         '<a href="mailto:\\1">\\1</a>',
                         '<a href="mailto:\\1">\\2</a>',
                         "('\\4' == '' && '\\1' == '' ? '<a href=\"mailto:\\2\">\\2</a>' : stripslashes('\\1\\2\\4'))",
                         );

    $news = preg_replace($replacewhat, $replacewith, $news);
  }

Grazie per l'interessamento

risposto 10 anni fa
mariusart
X 0 X

A me sembra che funzioni. Ho modificato lievemente il codice da te riportato in modo da provarne il funzionamento su una semplice stringa:

<?php
$news = "[b]ciao[/b] [color=red]ciao[/color]";

// Search for this...
$replacewhat = array(
'/\[url\](.+?)\[\/url\]/is',
'/\[url=(.+?)\](.+?)\[\/url\]/is',

'/\[ftp\](.+?)\[\/ftp\]/is',
'/\[ftp=(.+?)\](.+?)\[\/ftp\]/is',

'/\[b\](.+?)\[\/b\]/is',
'/\[i\](.+?)\[\/i\]/is',
'/\[u\](.+?)\[\/u\]/is',
'/\[del\](.+?)\[\/del\]/is',

'/\[color=(.+?)\](.+?)\[\/color\]/is',

'/\[img\](.+?)\[\/img\]/i',
'/\[img width=([0-9]+) height=([0-9]+)\s*\](.+?)\[\/img\]/i',
'/\[img width=([0-9]+)\s*\](.+?)\[\/img\]/i',
'/\[img height=([0-9]+) width=([0-9]+)\s*\](.+?)\[\/img\]/i',
'/\[img height=([0-9]+)\s*\](.+?)\[\/img\]/i',

'/\[email\](.+?)\[\/email\]/is',
'/\[email=(.+?)\](.+?)\[\/email\]/is',
'/(\/|=|"mailto:)?([a-z0-9_-][a-z0-9\._-]*@[a-z0-9_-]+(\.[a-z0-9_-]+)+)(\/|<)?/eis',
);

// ...and replace it with this
$replacewith = array(
'<a href="\\1">\\1</a>',
'<a href="\\1">\\2</a>',
'<a href="\\1">\\1</a>',
'<a href="\\1">\\2</a>',

'<b>\\1</b>',
'<i>\\1</i>',
'<u>\\1</u>',
'<del>\\1</del>',

'<font color="\\1">\\2</font>',

'<img src="\\1" alt="" />',
'<img src="\\3" alt="" width="\\1" height="\\2" />',
'<img src="\\2" alt="" width="\\1" />',
'<img src="\\3" alt="" width="\\2" height="\\1" />',
'<img src="\\2" alt="" height="\\1" />',

'<a href="mailto:\\1">\\1</a>',
'<a href="mailto:\\1">\\2</a>',
"('\\4' == '' && '\\1' == '' ? '<a href=\"mailto:\\2\">\\2</a>' : stripslashes('\\1\\2\\4'))",
);

$news = preg_replace($replacewhat, $replacewith, $news);

echo $news;
?>

Se provi a lanciare lo script otterrai come risultato:

<b>ciao</b> <font color="red">ciao</font>

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda