Newsgroup: it.comp.www.php
Titolo: htmlentities() e tag HTML

Salve a tutti.
Espongo subito il problema.
Diciamo che ho una stringa in un file di testo, e la voglio
visualizzare in un documento html. La stringa in questione sia:
"<b>Ciao!<b> Come stai? Mario č in salute."
Il primo problema č il carattere 'č'. Per traslarlo al corretto
&egrave; basta usare la funzione htmlentities(). Ma l'uso di questa
funzione invalida la giusta visualizzazione dei tag <b> e </b>, in
quanto essi verrebbero traslati con i &gt; e &lt; al posto dei
caratteri '>' e '<'.
Come fare allora a mantenere lo stile bold per la sottostringa
"Ciao!"?
Un articolo su WebmasterBase.com suggeriva la costruzione di un
proprio tag language, ad esempio usando [b] e [eb] al posto di <b> e
</b> (e cosě di seguito per altri tag html utili) e l'uso delle
funzioni eregi* per una corretta visualizzazione. Non dubito che la
cosa funzioni, ma non ci sarebbe una scorciatoia piů semplice e meno
laboriosa?
Grazie e ciao,
Giulio.

 "<b>Ciao!<b> Come stai? Mario è in salute."
Sorry, errore mio. htmlspecialchars ti da lo stesso problema.
quella ke suggerisci tu è interessante, ma kredo ke usare regexp per
convertire tutti i &gt; e &lt; in < e > sia + rapido, se sei sikuro ke poi
nei caratteri della stringa non debbano esserci parentesi angolari oltre a
quelle dell'html
Liliana
l...@NOSPAMsysthema.it

Ahh, ho appena finito di mangiare il mio panino al salame e mi sono venute
due risposte.
La prima: se sei sicuro che la stringa non abbia nessun "&gt;" o "&lt;" al
di fuori dei tag (nel tuo esempio quindi funziona) sei a cavallo.
SOLUZIONE - usa htmlentities() e poi trasformi gli "&gt;" e i "&lt;" in ">"
e "<"
Seconda: le parti di stringa che devi trasformare sono sempre quelle
comprese tra > e < (nel caso contrario sarebbero tag html).
SOLUZIONE - Devi prendere queste parti e usare htmlentities separatamente.
Spero ti basti la prima, anche perchč la seconda richiede piů lavoro.
LAMASE
"Wario" <gp...@nOSPAmSoftHome.net> ha scritto nel messaggio
news:3b01456e...@news.iperbole.bo.it...


La soluzione è vedere prima se nella stringa ci sono dei "&gt" e fratello,
dividerla e fare il giochino sui singoli pezzi. poi riunirla.
LAMASE


Molto elegante la seconda soluzione di LAMASE.
Resta però un problema: poniamo che io abbia un articolo formattato, cioè con tag html in quanto tali, ma anche con tag html che in realtà sono testo. Cioè:
    \&quot;Sezione 12: Il grassetto
    Il grassetto si fa con i tag  e \&quot;
In questo caso i primi tag vanno lasciati come tali, i secondo vanno trasformati in &amp;amp;lt;b&amp;amp;gt; eccetera.
Allora le soluzioni secondo me sono due:
1. chi scrive l\'articolo in questione deve GIA\' aver trasformato gli  nei corrispondenti &amp;amp;lt; e &amp;amp;gt; Solo che poi passando il testo a htmlentities diventa più o meno &amp;amp;amp;lt; !!!
2. Utilizzare una sorta di \&quot;caratteri di escape\&quot;, tipo appunto [i] e [ei], oppure potrebbero essere &gt; e &gt;. Nel primo caso htmlentities() fila via liscio, nel secondo invece bisogna fargli ignorare gli apici quando doppi e poi trasformarli in ! E come si sa le funzioni relative alle regular expressions sono un po\' pesanti.
Quindi in ultima analisi penso che la soluzione di WebmasterBase resti abbastanza valida, salvo che uno non abbia la sfortunata necessità di scrivere un testo con degli [i] dei [b] eccetera!!! (che ne so, mi vengono in mente le trascrizioni di epigrafi o le edizioni di testi antichi in cui le lacune possono venire integrate con testo compreso tra [ ] ).
Insomma, sembra che nessuno su questo abbia una soluzione definitiva... O no?
M
Posted by 
http://www.phpitalia.com

Insomma, sembra che nessuno su questo abbia una soluzione definitiva... O no?
Vi posso dire come ho risolto io, se volete :)
Premetto che sia la soluzione di WebmasterBase, sia le soluzioni di
LAMASE, mi sono piaciute abbastanza. Forse la cosa migliore, almeno in
via teorica, sarebbe stata riscriversi una propria htmlentities() in
modo che gestisse SOLO certi caratteri (le accentate ed i quote, ad
esempio, ma non i '>' e i '<').
La soluzione che ho scelto è stata anche dettata dal problema che mi
trovavo ad affrontare. Ho degli articoli contenuti in alcuni file,
all'interno dei quali ci sono tag HTML. Questi articoli devono essere
visualizzati in documento HTML, ma devono anche poter essere spediti
come mail di solo testo, nel qual caso, evidentemente, i tag HTML
devono sparire. C'è la semplice strip_tags() per questo, ma se avessi
adottato la soluzione di WebmasterBase (un mio tag language) avrei
dovuto anche scrivermi una mia strip_tags().
Così ho adottato la prima soluzione proposta da LAMASE. La più
semplice, intuitiva e meno laboriosa. Tre righe di codice: una
htmlentities() e due eregi_replace(), una con "&gt;" e una con "&lt;"
ed il gioco è stato fatto. Dando un'occhiata agli articoli, mi sono
accorto che nessuno conteneva i caratteri '>' e/o '<', e che per il
tipo di giornale (un supplemento di un normale quotidiano) sarebbe
stata altamente improbabile una loro eventuale futura presenza.
Questo ha implicato altre scelte: ad esempio, negli eventuali tag
anchor presenti nei testi degli articoli, l'argomento dell'attributo
href non deve essere scritto tra doppi apici, perché essi sarebbero
trasformati prima della visualizzazione online, facendo loro perdere
il significato originale.
Ma in realtà, anche questa difficoltà sarebbe facilmente aggirabile.
Basterebbe incapsulare le tre chiamate dette in una funzione, alla
quale viene passato come parametro un array contenente i caratteri da
ritrasformare una volta eseguita la htmlentities(). La funzione
dovrebbe poi ciclare su tutti gli elementi dell'array effettuando per
ognuno una eregi_replace().
Ammetto che la soluzione non è particolarmente elegante. Ma è
quantomeno funzionale. Penso che alla fine una soluzione definitiva
non esista, e che la scelta della soluzione sia da fare a seconda del
problema che uno si trova ad affrontare, e a seconda del tempo che può
dedicare alla sua risoluzione. Ad esempio, l'idea di ricreare un mio
tag language mi attirava abbastanza, ma come soluzione era senza
dubbio oversized rispetto al problema che mi si presentava. Si
potrebbe dire che in realtà la prima soluzione di LAMASE fosse il best
fit per il mio problema ;).
Concludo facendo comunque notare come la mia soluzione di riportare
gli html special chars che mi servono al loro stato originale non si
discosti poi più di tanto dalla soluzione di WebmasterBase: anche in
questo caso infatti, nel codice proposto viene effetuata una chiamata
ad htmlentities() e successive chiamate a eregi_replace() per
trasformare i tag del "nuovo" linugaggio nei tag HTML corrispondenti.
In un certo senso, questo mi conforta :)
Ciao,
Giulio.