Декодировать числовые объекты HTML в ColdFusion?

Во-первых, все, кто пишет JavaScript, делают себе одолжение и проходят Изучение продвинутого JavaScript из Джона Резига .

function myFunc(arg1, arg2 /* varargs... */) {
  var optional = Array.prototype.slice.call( arguments, 2 );

Каждый параметр функции является «необязательным», даже тот, который вы объявляете в списке параметров объявления функции.

Просто рассмотрите документирование их хорошо.

9
задан Peter Boughton 29 October 2009 в 23:04
поделиться

3 ответа

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

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

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



Исходный ответ:

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

Гораздо проще позволить 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>
28
ответ дан 4 December 2019 в 07:04
поделиться

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

1
ответ дан 4 December 2019 в 07:04
поделиться

Обычный способ сделать это в приложении хранилища данных с низкой задержкой состоит в том, чтобы иметь секционированную таблицу с ведущим разделом, содержащим то, что может быть быстро обновлено (то есть без необходимости пересчитывать агрегаты на лету), но с задними разделами, заполненными агрегатами. Другими словами, ведущий раздел может использовать другую схему места хранения для конечных разделов.

Большинство коммерческих и некоторых платформ RDBMS с открытым исходным кодом (например, PostgreSQL) могут поддерживать секционированные таблицы, которые могут быть так или иначе использованы для этого типа вещей. Процедура заполнения базы данных из журналов остается в качестве упражнения для читателя.

В основном структура системы этого типа выглядит следующим образом:

  • У вас есть таблица, секционированная на некоторые вид даты или значения даты-времени, с разделением по часам, дням и т.п. зерно кажется подходящим. Журнал записи добавляются к этой таблице.

  • По мере схода временного окна раздел, периодические индексы заданий или суммирует его и преобразует в его «замороженное» состояние. Например, задание в Oracle может создавать растровое изображение индексы в этой секции или обновить материализованное представление для включения сводки данные для этого раздела.

  • Позднее можно удалить старые данные, суммировать его или объединять разделы вместе.

  • С течением времени периодическое задание спина заполняется за передней кромкой разбиение. Исторические данные: преобразован в формат, предоставляющий кредиты себя в исполнительскую статистическую запросы во время переднего края раздел поддерживается простым в обновлении быстро. Так как этот раздел не имеют так много данных, запрашивая через весь набор данных относительно быстро.

Точный характер этого процесса зависит от платформы СУБД.

Например, разбиение таблиц на разделы на SQL Server не все так хорошо, но это можно сделать с помощью служб Analysis Services (OLAP-сервер, который Microsoft объединяет с SQL Server). Это делается путем настройки ведущего раздела как чистого ROLAP (сервер OLAP просто выдает запрос к базовой базе данных), а затем перестраивает конечные разделы как MOLAP (сервер OLAP создает свои собственные специализированные структуры данных, включая постоянные сводки, известные как «агрегации»). Службы анализа могут делать это полностью прозрачно для пользователя. Он может перестроить раздел в фоновом режиме, пока старый ROLAP все еще виден пользователю. После завершения построения выполняется свопинг в разделе; куб доступен все время без прерывания обслуживания пользователя.

Oracle позволяет обновлять структуры разделов независимо друг от друга, что позволяет создавать индексы или создавать разделы на основе материализованного представления. С помощью функции повторной записи запроса оптимизатор запросов в Oracle может определить, что агрегированные цифры, рассчитанные из таблицы базовых фактов, могут быть получены из материализованного представления. Запрос будет считывать агрегированные цифры из материализованного представления, где доступны разделы, и из переднего раздела, где их нет.

PostgreSQL может сделать нечто подобное,но я никогда не смотрел на внедрение такого типа системы.

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

Edit: В зависимости от формата файлов журнала или доступных параметров ведения журнала, существует несколько способов загрузки данных в систему. Некоторые опции:

  • Напишите сценарий, используя свой любимый язык программирования, который считывает данные, анализирует соответствующие биты и вставляет их в базу данных. Это может выполняться довольно часто, но у вас должен быть какой-то способ сохранить трек о том, где вы находитесь в файле. Будьте осторожны с блокировкой, особенно в Windows. Семантика блокировки файлов по умолчанию в Unix/Linux позволяет сделать это (так работает tail -f ), но поведение по умолчанию в Windows отличается; обе системы должны быть написаны, чтобы хорошо играть друг с другом.

  • В системе unix-oid можно записать журналы в канал и выполнить процесс, аналогичный описанному выше. Это будет иметь наименьшую задержку из всех, но сбои в считывающем устройстве могут заблокировать ваше приложение.

  • Вместо записи файлов журнала напишите для приложения интерфейс ведения журнала, который непосредственно заполняет базу данных.

  • Используйте API массовой загрузки для базы данных (большинство, если не все, имеют этот тип API) и загрузите данные регистрации в пакеты. Напишите подобную программу для первого варианта, но используйте API массовой загрузки. Это, но будет использовать меньше ресурсов, чем заполнение его по очереди, но имеет больше накладных расходов для настройки массовых нагрузок. Это было бы подходящим для менее частой нагрузки (возможно, ежечасно или ежедневно) и привело бы к меньшей нагрузке на систему в целом.

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

  • Одним из вариантов было бы изменение регистратора, чтобы он начинал записывать в другой файл каждый период (скажем, каждые несколько минут). Периодически запускайте программу чтения журналов и загружайте новые файлы, которые еще не были обработаны. Прочитайте старые файлы. Чтобы это сработало, схема именования файлов должна основываться на времени, чтобы читатель знал, какой файл нужно забрать. Работа с файлами, которые все еще используются приложением, является более точной (затем вам нужно будет отслеживать, сколько было прочитано), так что вы хотите читать файлы только до последнего периода.

  • Другой вариант - переместить файл и затем прочитать его. Это лучше всего подходит для файловых систем, которые ведут себя как Unix, но должны работать на NTFS. Вы перемещаете файл, а затем читаете его во время аренды.Однако для этого требуется, чтобы регистратор открыл файл в режиме создания/добавления, записал в него, а затем закрыл, не оставляя его открытым и заблокированным. Это определенно поведение Unix - операция перемещения должна быть атомной. В Windows, возможно, вам действительно придется стоять над регистратором, чтобы это сработало.

-121--3153557-

Модуль потоков python позволяет указать новый размер стека для новых потоков. Попробуйте установить значение, которое, по вашему мнению, достаточно велико, и затем выполнить работу этой DLL в новом потоке.

-121--3612837-

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

Я адаптировал функцию Питера Боутона, чтобы ее можно было безопасно использовать в последовательностях, которые еще не были обработаны сущностями HTML. (Единственный раз, когда это, кажется, имеет значение, когда свободные амперсанды - то есть «Кошки и собаки» - присутствуют в целевой последовательности.) Эта измененная версия также потерпит определенный сбой при любой непредвиденной ошибке синтаксического анализа 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>

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

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

0
ответ дан 4 December 2019 в 07:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: