Декодировать числовые HTML-объекты в ColdFusion? - PullRequest
9 голосов
/ 30 октября 2009

Мне нужен способ преобразовать числовые сущности HTML в их текстовые эквиваленты. Например, я хотел бы превратить сущность:

é

на персонажа:

é

Посмотрев немного, я нашел функцию с именем HtmlUnEditFormat , но эта функция преобразует только именованные объекты. Есть ли способ декодировать числовые объекты в ColdFusion?

Ответы [ 4 ]

28 голосов
/ 30 октября 2009

Обновленный ответ:

Спасибо Тодду Шарпу за указание на очень простой способ сделать это, используя библиотеку Apache Commons StringEscapeUtils, которая поставляется с CF (и Railo), так что вы можете просто сделать:

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


<ч />

Оригинальный ответ:

Эта связанная функция icky - нет необходимости указывать их явно, и, как вы говорите, она не работает с цифрами.

Гораздо проще позволить CF сделать всю работу за вас - используя функцию 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>

Это работает с Railo, я не могу вспомнить, поддерживает ли CF этот синтаксис, так что вам может потребоваться изменить его на:

<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>
3 голосов
/ 04 октября 2012

Вот еще одна функция, которая будет декодировать все числовые html-символы в строке. Он не использует синтаксический анализ XML, поэтому он будет работать со строками, содержащими несбалансированные теги XML. Это неэффективно, если строка содержит большое количество объектов, но очень хорошо, если их нет / мало. Я проверял это только на Railo, а не на 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>
1 голос
/ 30 октября 2009

Это должно быть довольно легко самостоятельно. Просто отредактируйте найденную вами функцию HtmlUNEditFormat (), чтобы включить их в конец lEntities & lEntitiesChars.

0 голосов
/ 15 января 2010

Я нашел этот вопрос, работая с методом, который по принципу черного ящика не может доверять, что входящая строка либо закодирована в виде HTML-сущности, либо нет.

Я адаптировал функцию Питера Боутона так, чтобы она могла безопасно использоваться в строках, которые еще не обрабатывались с помощью HTML-сущностей. (Единственный случай, когда это имеет значение, - это когда в целевой строке присутствуют свободные амперсанды, то есть "Cats & Dogs".) Эта измененная версия также будет несколько изящно работать при любой непредвиденной ошибке синтаксического анализа XML.

<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>

Это будет безопасно поддерживать следующий вариант использования:

<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>

Эта функция теперь невероятно полезна для обеспечения безопасности содержимого, отправляемого через Интернет, до тех пор, пока оно не будет отправлено по электронной почте или отправлено в таблицу базы данных.

Надеюсь, это поможет.

...