[gl-como] php: bbcode+regexb && caratteri speciali

Luca kronos.it@gmail.com
Gio 4 Gen 2007 19:31:05 CET


On 1/4/07, redshadow <redshadowhack@gmail.com> wrote:
> mi servirebbe un consiglio su come scrivere in php una funzione per
> convertire tutti i caratteri
> speciali inviati in un modulo in codici html e una per convertire tag bbcode
> in html..
>
>
> per la prima:
> ho provato cose tipo
> for ( $i=128 ; $i<=255 ; $i++ ) $text = str_replace ( chr($i) , "&#$i;" ,
> $text );
> ma senza successo, cioè non viene sostituito nulla..

Description
string chr ( int ascii )

Returns a one-character string containing the character specified by ascii

Visto che poi i caratteri ti arrivano dall'esterno non hai garanzia
sull'encoding (ad esempio 'è' in utf-8 è una sequenza di 2byte).


> $text = str_replace ( "è" , "&#232;" , $text );
> funziona, ma implicherebbe 127 righe di codice..

str_replace opera anche con array.

> per la seconda:
> una possibilità che ho usato per [b]testo[/b] => <b>testo</b>
> $text = str_replace ( "[b]" , "<b>" , $text );
>  $text = str_replace ( "[/b]" , "</b>" , $text );
> ..che per funzionare funziona, ma già così ha qualche svantaggio, tipo che
> si può lasciare
> un <b> aperto e riformattare tutto il testo dopo..
> con cose tipo
> $text = str_replace ( "[img]" , "<img src='" , $text );
>  $text = str_replace ( "[/img]" , "'>" , $text );
> ancora peggio, se un malintenzionato mettesse [img]immagine.jpg'
> width='1000%[/img]...
> quindi mi pongo la domanda: si può fare una regexp che sostituisce solo se
> ci sono
> tutti i delimitatori necessari (anche più di due in certi casi..)?

preg_replace("#\[b\](.*)\[/b\]#", "<b>$1</a>", $text);

Ma forse devi raffinare .* per evitare casini con il nesting.

> e per [link]www.miosito.net[/link] => <a href="
> www.miosito.net">www.miosito.net</a>?
> cioè, un sistema per prendere del testo incluso tra delimitatori e
> sostituirlo inserendolo
>  due volte nel testo finale..?

preg_replace("#\[url\](.*)\[/url\]#", "<a href=\"$1\">$1</a>", $text);

Luca


Maggiori informazioni sulla lista gl-como