Dekodieren Numerisch HTML Entities in Coldfusion?
-
22-07-2019 - |
Frage
Ich brauche eine Möglichkeit, numerische HTML-Entitäten in ihre Klartext-Zeichen äquivalent zu transformieren. Zum Beispiel würde Ich mag die Person wenden:
é
in den Charakter:
é
Durch einige googeln um, fand ich eine Funktion namens HtmlUnEditFormat , aber diese Funktion wandelt nur benannten Entitäten. Gibt es eine Möglichkeit numerische Entitäten in Coldfusion zu entschlüsseln?
Lösung
Aktualisiert Antwort:
Dank Todd Sharp für eine sehr einfache Art und Weise unter Hinweis darauf, dies zu tun, die Apache Commons StringEscapeUtils-Bibliothek, die mit CF (und Railo) verpackt ist, so können Sie einfach tun:
<cfset Entity = "&##0233;" />
<cfset StrEscUtils = createObject("java", "org.apache.commons.lang.StringEscapeUtils") />
<cfset Character = StrEscUtils.unescapeHTML(Entity) />
Original Antwort:
Die verknüpfte Funktion ist eklig -. Es gibt keine Notwendigkeit, sie explizit zu nennen, und wie Sie sagen, es ist nicht Numerik macht
Viel einfacher ist CF für Sie die Arbeit tun zu lassen - mit der XmlParse
Funktion:
<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>
Dass man mit Railo funktioniert, kann ich mich nicht erinnern, wenn CF noch, obwohl diese Syntax unterstützt, so dass Sie es sich ändern könnte müssen:
<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>
Andere Tipps
Hier ist eine andere Funktion, die alle numerischen HTML-Entitäten in einem String dekodieren. Es beruht nicht auf XML-Analyse, so dass es auf Strings arbeiten, die unausgeglichenen xml-Tags enthalten. Es ist nicht effizient, wenn die Zeichenfolge, die eine große Anzahl von Unternehmen haben, aber es ist ziemlich gut, wenn es keine / wenige. Ich habe nur diese auf Railo getestet, nicht 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>
Es sollte ganz einfach sein, eine bis selbst zu codieren. Nur bearbeiten Sie die HtmlUNEditFormat () Func Sie, um sie bis zum Ende des lEntities & lEntitiesChars umfassen.
Ich fand diese Frage, während sie mit einem Verfahren arbeiten, das von Black-Box-Prinzip kann nicht darauf vertrauen, dass eine eingehende Zeichenfolge entweder HTML-Entität codierte oder dass es nicht ist.
Ich habe Funktion Peter Boughton ist so angepasst, dass es auf Strings sicher verwendet werden kann, die nicht bereits mit HTML-Entitäten behandelt wurden. (Das einzige Mal, an die Materie scheint dies ist, wenn lose Et-Zeichen - das heißt „Cats & Dogs“ -. Vorhanden sind, im Zielstring). Diese modifizierte Version wird auch etwas anmutig auf jedem unforseen XML Parser-Fehler fehlschlagen
<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+);)', '&', 'all') />
<cftry>
<cfset XMLDoc = XmlParse(XML) />
<cfreturn XMLDoc.XMLRoot.XMLText />
<cfcatch>
<cfreturn arguments.str />
</cfcatch>
</cftry>
</cffunction>
Dies würde unterstützt den folgenden Anwendungsfall sicher:
<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>
Diese Funktion dient zur Sicherstellung web-gestellten Inhalte ist einheits sicher (man denke XSS) jetzt unglaublich nützlich ist, bevor es per E-Mail geschickt hat oder in eine Datenbanktabelle geschrieben.
Hope, das hilft.