Salve a tutti.
Qualche giorno fa avevo abbozzato un inizio di funzione per ottenere un bbcode nel testo di un forum. La potete trovare qui . Dopo un po' di tentativi e di aggiustamenti credo di essere riuscito nel mio intento.
La funzione è basata sulla sostituzione di stringhe all'interno del testo. Sono tre funzioni, in realtà. Posto lo script chiosato e commentato in attesa di suggerimenti per migliorarlo qualora fosse necessario.
Codice PHP:
<?php
function crea_stringhe($testo, $x, $y){
$pos=strpos($testo, "[$x]");//posizione all'interno del testo del primo tag
$stringa_tag=strstr($testo, "[$x]");//creo una nuova stringa che inizia con il primo tag di apertura
//trovato nel $testo
$posx=strpos($stringa_tag, "[$x]");//posizione del tag di apertura nella stringa
$posy=strpos($stringa_tag, "[/$y]");//posizione del tag di chiusura nella stringa
$lenx=strlen("[$x]");//lunghezza in caratteri del tag di apertura
$leny=strlen("[/$y]");//lunghezza in caratteri del tag di chiusura
if(($x==$y)and(strstr($stringa_tag, "[/$y]"))){//se all'interno della stringa è presente un
//tag di chiusura e le stringhe contenute all'interno dei tag sono uguali
if($x=="b" or $x=="i" or $x=="u"){//specificazione forse non necessaria
$n_str=substr_replace($stringa_tag, "</$y>", $posy, $leny);//sostituisco il tag
//di chiusura alla fine della stringa che inizia col tag di apertura trovato, a partire dalla posizione del
//tag per la lunghezza del tag stesso
$n_testo=substr_replace($n_str, "<$x>", $posx, $lenx);//sostituisco il tag di
//apertura all'inizio della stringa appena trasformata, a partire dalla posizione del tag per la
//lunghezza del tag stesso
/*in realtà potrei non aver bisogno di individuare la lunghezza del tag, visto che so che è
composto da una sola lettera*/
$l_n_testo=strlen($n_testo);//calcolo la lunghezza del testo ottenuto
/*questa variabile è superflua dato che la stringa che ho modificato verrà sostituita all'interno del testo
a partire dal punto in cui comincia la stringa stessa, cioé lì dove ho incontrato il primo tag apertura*/
$testo_finale=substr_replace($testo, $n_testo, $pos);//parametro lunghezza
//non è quindi indicato
}else if($x=="quote"){
$n_str=substr_replace($stringa_tag, "</div>", $posy, $leny);//discorso a
//parte per il tag \[\q\u\o\t\e\] per il quale non può bastare una semplice sostituzione come per [B]b[/B]
$n_testo=substr_replace($n_str, "<div class=\"cit\">", $posx, $lenx);
$l_n_testo=strlen($n_testo);
$testo_finale=substr_replace($testo, $n_testo, $pos);
}
}else{
$testo_finale=$testo;
}
return $testo_finale;
}
Con la funzione crea_stringhe ho sostituito i tag bbcode con tag html solo nella prima stringa che rispettava tutte le condizioni, cioé cominciare con un tag apertura, avere un tag di chiusura con la stessa lettera (o stringa nel caso di quote) di seguito. Bisogna applicare la funzione a tutto il testo.
Codice PHP:
function reitera($testo, $x,$y){
$varx=(substr_count($testo, "[$x]"));//conto le occorrenze di tag apertura
$vary=(substr_count($testo, "[/$y]"));
if($varx>0 AND $x==$y){//se c'è almeno un tag di apertura faccio partire il controllo
for($cont=0;$cont<$varx;$cont++){//il controllo si ripete sul testo per un numero di
// volte pari al numero di occorrenze di tag apertura
$stringa=strstr($testo, "[$x]");//compio un'operazione analoga a quella della
//prima funzione - forse c'è un modo per accorpare le due funzioni
if(strstr($stringa, "[/$y]")){//se c'è il tag chiusura
$testo=crea_stringhe($testo,$x,$y);//applico la prima funzione
/* qui ho un dubbio consistente; per far funzionare il ciclo devo creare una variabile con lo
stesso nome della variabile iniziale; dato che applico la funzione crea_stringhe a $testo,
il risultato finale del ciclo deve essere sempre $testo*/
}else{//se non è seguito dal tag di chiusura
$testo=$testo;
}//else
}//for
}//primo if
return $testo;
}
Anche la funzione reitera ha un difetto sostanziale; bisogna specificare quali tag cercare all'interno del testo; allora ho fatto questa piccola funzione sulla base della precedente che non necessita troppo spiegazioni... nelle due funzioni precedenti bisognava specificare $x e $y, con l'ultima funzione estendo la ricerca a tutti i tag di cui ho bisogno - quelli ordinati nell'array
Codice PHP:
function bbcode($testo){
$var=array("i", "u", "quote","b");
for($cont=0; $cont<4; $cont++){
$testo=reitera($testo, $var[$cont], $var[$cont]);
}
return $testo;
}
?>
Funziona.
Per il forum che sto per costruire, che è un piccolo forum, è davvero comodo. Basta applicare la funzione al testo del messaggio che richiamo dal database.
E' utile perché cambia i tag bbcode con tag html solo nelle stringhe complete. Ho avuto la necessità di andare più in là di una semplice sostituzione di testo e di creare dei controlli per ovvi motivi. Se qualcuno, per sbaglio o per cattiveria, aprisse il tag QUOTE e non lo chiudesse, dato che corrisponde al tag html DIV farebbe non pochi danni alla pagina.
Scusate se mi sono dilungato troppo.
Attendo suggerimenti.
Ciao a tutti