Domanda

Ho bisogno di un modo per trasformare entità HTML numeriche nel loro equivalente in caratteri di testo semplice. Ad esempio, vorrei trasformare l'entità:

é

nel personaggio:

é

Attraverso alcuni google ho trovato una funzione chiamata HtmlUnEditFormat , ma questa funzione trasforma solo entità nominate. Esiste un modo per decodificare entità numeriche in ColdFusion?

È stato utile?

Soluzione

Risposta aggiornata:

Grazie a Todd Sharp per aver sottolineato un modo molto semplice per farlo, usando la libreria StringEscapeUtils di Apache Commons, che è impacchettata con CF (e Railo), quindi puoi semplicemente fare:

<cfset Entity = "&##0233;" />
<cfset StrEscUtils = createObject("java", "org.apache.commons.lang.StringEscapeUtils") />
<cfset Character = StrEscUtils.unescapeHTML(Entity) />


Risposta originale:

Quella funzione collegata è icky - non c'è bisogno di nominarli esplicitamente, e come dici tu non fa i numeri.

Molto più semplice è lasciare che CF faccia il lavoro per te - usando la funzione XmlParse :

<cffunction name="decodeHtmlEntity" returntype="String" output="false">
    <cfargument name="Entity" type="String" hint="&##<number>; or &<name>;" />
    <cfreturn XmlParse('<xml>#Arguments.Entity#</xml>').XmlRoot.XmlText />
</cffunction>

Quello funziona con Railo, ma non ricordo se CF supporta ancora quella sintassi, quindi potrebbe essere necessario cambiarlo in:

<cffunction name="decodeHtmlEntity" returntype="String" output="false">
    <cfargument name="Entity" type="String" hint="&##<number>; or &<name>;" />
    <cfset var XmlDoc = XmlParse('<xml>#Arguments.Entity#</xml>') />
    <cfreturn XmlDoc.XmlRoot.XmlText />
</cffunction>

Altri suggerimenti

Ecco un'altra funzione che decodificherà tutte le entità numeriche di caratteri html in una stringa. Non si basa sull'analisi XML, quindi funzionerà su stringhe che contengono tag XML non bilanciati. Non è efficiente se la stringa ha un gran numero di entità, ma è abbastanza buona se non ce ne sono / poche. L'ho provato solo su Railo, non su AdobeCF.

<cffunction name="decodeHtmlEntities" returntype="String" output="false">
    <cfargument name="s" type="String"/>
    <cfset var LOCAL = {f = ReFind("&##([0-9]+);", ARGUMENTS.s, 1, true), map={}}>
    <cfloop condition="LOCAL.f.pos[1] GT 0">
        <cfset LOCAL.map[mid(ARGUMENTS.s, LOCAL.f.pos[1], LOCAL.f.len[1])] = chr(mid(ARGUMENTS.s, LOCAL.f.pos[2], LOCAL.f.len[2]))>
        <cfset LOCAL.f = ReFind("&##([0-9]+);", ARGUMENTS.s, LOCAL.f.pos[1]+LOCAL.f.len[1], true)>
    </cfloop>
    <cfloop collection=#LOCAL.map# item="LOCAL.key">
        <cfset ARGUMENTS.s = Replace(ARGUMENTS.s, LOCAL.key, LOCAL.map[LOCAL.key], "all")>
    </cfloop>
    <cfreturn ARGUMENTS.s />
</cffunction>

Dovrebbe essere abbastanza facile codificarne uno da soli. Basta modificare la funzione HtmlUNEditFormat () che hai trovato, per includerli fino alla fine delle lEntities & amp; lEntitiesChars.

Ho trovato questa domanda mentre lavoravo con un metodo che, per principio di black box, non può fidarsi che una stringa in arrivo sia codificata in entità HTML o che non lo sia.

Ho adattato la funzione di Peter Boughton in modo che possa essere utilizzata in sicurezza su stringhe che non sono già state trattate con entità HTML. (L'unica volta in cui questo sembra avere importanza è quando nella stringa di destinazione sono presenti e commerciali sciolte - ovvero "Cats & amp; Dogs"). Questa versione modificata fallirà in qualche modo con grazia su qualsiasi errore di analisi XML non previsto.

<cffunction name="decodeHtmlEntity" returntype="string" output="false">
    <cfargument name="str" type="string" hint="&##<number>; or &<name>;" />
    <cfset var XML = '<xml>#arguments.str#</xml>' />
    <cfset var XMLDoc = '' />

    <!--- ampersands that aren't pre-encoded as entities cause errors --->
    <cfset XML = REReplace(XML, '&(?!(\##\d{1,3}|\w+);)', '&amp;', 'all') />

    <cftry>
        <cfset XMLDoc = XmlParse(XML) />
        <cfreturn XMLDoc.XMLRoot.XMLText />
        <cfcatch>
            <cfreturn arguments.str />
        </cfcatch>
    </cftry>
</cffunction>

Questo supporterebbe in sicurezza il seguente caso d'uso:

<cffunction name="notifySomeoneWhoCares" access="private" returntype="void">
    <cfargument name="str" type="string" required="true"
        hint="String of unknown preprocessing" />
    <cfmail from="process@domain.com" to="someoneWhoCares@domain.com"
        subject="Comments from Web User" format="html">
        Some Web User Spoke Thus:<br />
        <cfoutput>#HTMLEditFormat(decodeHTMLEntity(arguments.str))#</cfoutput>
    </cfmail>
</cffunction>

Questa funzione è ora incredibilmente utile per garantire che i contenuti inviati dal Web siano sicuri per le entità (pensate a XSS) prima che vengano inviati via e-mail o inviati a una tabella di database.

Spero che questo aiuti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top