se un utente scrive <B> (oppure [B]..) ma si dimentica di chiudere..
...Ci vorrebbe una funzione che leggesse tutto il testo inserito dall'utente e automaticamente chiudesse i tag aperti...
Ne avete una gia pronta?
P.S: non posso usare htmlentities!
Printable View
se un utente scrive <B> (oppure [B]..) ma si dimentica di chiudere..
...Ci vorrebbe una funzione che leggesse tutto il testo inserito dall'utente e automaticamente chiudesse i tag aperti...
Ne avete una gia pronta?
P.S: non posso usare htmlentities!
E come si fa a capire quando l'utente voleva chiudere il tag? se quel tag deve essere per 1,2 o tre parole?
In quel caso mi sa che si può fare veramente poco, l'unica è l'accortezza dell'utente a chiudere tutti i tag che apre
:wink:
Beh dai non importa... Magari tutto quello che scrive lui nel suo post gli resta in grassetto.. poco importa... L'importante è che non diventi grassetto tutto il sito!
Stavo pensando che potrei fare un modo che lui "conti" quante volte la sottostringa <B> è presente nel testo, e quante volte è invece presente il </B>...
Se il num. dei <b> è maggiore dei </b>, lui piazza tanti </b> quanti servono per chiudere...
Penso che risolverò la questione con substr_count a meno che voi non abbiate un'idea migliore...
puoi con un espressione regolare cambiare i tag e se non è chiuso alla fine il tag nn cambi niente.
devi usare un codice tipo questo:
ciao ^__^Codice PHP:<?
$text = $_POST['text'];
$text = preg_replace("#\[B\](.*?)\[\/B\]#is", "<b>$1</b>", $text);
echo $text;
?>
Codice PHP:$string = preg_replace("#\[B\](.*?)\[\/B\]#is", "[B]$1[/B]", $string);
L'ho usata così... come mai non va?
Non va perché quel codice trasforma i tag [b] e [/b] in <b> e </b> se vengono chiusi correttamente.
se scrivi solo [B] non ti scrive tutto in grassetto ma neanche ti chiude il tagCitazione:
Originalmente inviato da attorianzo
ciao ^__^
secondo me per quello che vuoi fare tu sarebeb meglio fare inserire i campi con js in un
prompt
MM.... non so guarda questa riga non funziona...Codice PHP:$string = preg_replace("#\[B\](.*?)\[\/B\]#is", "[B]$1[/B]", $string);
Se l'utente scrivesse nella textarea "pippo" allora ok, il tag apre e chiude ed è tutto apposto e il risultato è solo "pippo".
Invece se l'utente scrive "[B]pippo" allora il risultato è "pippo" e tutto il resto del suo post piu tutto il resto della mia pagina da quel punto in poi diventa tutto in grassetto.. Attualmente per evitare il problema uso:
Codice PHP:$string = chiudi_tag_lasciati_aperti($string, "[B]", "[/B]");
$string = chiudi_tag_lasciati_aperti($string, "[I]", "[/I]");
$string = chiudi_tag_lasciati_aperti($string, "[U]", "[/U]");
function chiudi_tag_lasciati_aperti($string, $tag_aperto, $tag_chiuso) {
$corrisp_apertura = substr_count($string, $tag_aperto);
$corrisp_chiusura = substr_count($string, $tag_chiuso);
if ( $corrisp_apertura > $corrisp_chiusura ) {
$numero_chiusure = $corrisp_apertura - $corrisp_chiusura;
for ($x=1; $x <= $numero_chiusure; $x++) {
$string .= $tag_chiuso;
}
}
return $string;
}
Così funziona... Non riesco a fare funzionare invece quella espressione regolare non capisco dove sta l'errore...
Io uso questa e mi funziona:
Codice PHP:$testo=preg_replace("#\[b\](.+?)\[/b\]#si", "<b>\\1</b>", $testo);
Non è che è perchè sostituisci [B] con [B] invece che con <b>?Citazione:
Originalmente inviato da attorianzo
Quella espressione regolare non fa altro che convertire [ b] in <b>, non chiude e non conta nulla. Quindi quella funzione chiudi_tag_lasciati_aperti va benissimo... :wink:
Signori.... ci ho lavorato su stasera...
..Vi presento la soluzione definitiva:
Ciauz!!!Codice PHP:
function chiudi_tag_lasciati_aperti($string, $tag_aperto, $tag_chiuso) {
$pieces = explode($tag_aperto, $string);
$lungh_array= count($pieces);
for ($x=0; $x < $lungh_array; $x++) {
if ( $x!=0 && strpos($pieces[$x], $tag_chiuso) === FALSE) $pieces[$x] .= $tag_chiuso;
}
$string = implode ($tag_aperto,$pieces);
return $string;
}