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?

War es hilfreich?

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+);)', '&amp;', '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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top