Существует ли стандартная функция Delphi для выхода из HTML?

У меня есть отчет, это, как предполагается, берет на себя управление сеткой и производит вывод HTML. Один из столбцов в сетке может отобразить любое из многих значений, или <Any>. Когда это производится к HTML, конечно, он заканчивается пробел.

Я мог, вероятно, описать некоторую стандартную программу для использования StringReplace для превращения этого в &lt;Any&gt; таким образом, это отобразило бы этот конкретный случай правильно, но я полагаю, что существует, вероятно, один в RTL где-нибудь, это было уже протестировано и делает его правильно. Кто-либо знает, где я мог найти его?

26
задан Mason Wheeler 3 June 2010 в 16:55
поделиться

4 ответа

Я на 99% уверен, что такой функции нет в RTL (по состоянию на Delphi 2009). Конечно, однако - написать такую ​​функцию - тривиально.

Обновление

HTTPUtil.HTMLEscape - это то, что вы ищете:

function HTMLEscape(const Str: string): string;

Я не решаюсь публиковать здесь код (возможно, нарушение авторских прав), но процедура очень проста. Он кодирует "<", ">", "&" и "" "в <, > , & и " ]. Он также заменяет символы # 92, # 160 .. # 255 на десятичные коды, например \ .

Этот последний шаг не нужен, если файл UTF-8, а также нелогичен, потому что высшие специальные символы, такие как, остаются без изменений, а младшие специальные символы, такие как ×, кодируются.

Обновление 2

В ответ на ответ Стейна Сандерса я провел простой тест производительности.

program Project1;

{$APPTYPE CONSOLE}

uses
  Windows, SysUtils;

var
  t1, t2, t3, t4: Int64;
  i: Integer;
  str: string;
const
  N = 100000;


function HTMLEncode(const Data: string): string;
var
  i: Integer;
begin

  result := '';
  for i := 1 to length(Data) do
    case Data[i] of
      '<': result := result + '&lt;';
      '>': result := result + '&gt;';
      '&': result := result + '&amp;';
      '"': result := result + '&quot;';
    else
      result := result + Data[i];
    end;

end;

function HTMLEncode2(Data: string):string;
begin
  Result:=
    StringReplace(
    StringReplace(
    StringReplace(
    StringReplace(
      Data,
      '&','&amp;',[rfReplaceAll]),
      '<','&lt;',[rfReplaceAll]),
      '>','&gt;',[rfReplaceAll]),
      '"','&quot;',[rfReplaceAll]);
end;

begin

  QueryPerformanceCounter(t1);
  for i := 0 to N - 1 do
    str := HTMLEncode('Testing. Is 3*4<3+4? Do you like "A & B"');
  QueryPerformanceCounter(t2);

  QueryPerformanceCounter(t3);
  for i := 0 to N - 1 do
    str := HTMLEncode2('Testing. Is 3*4<3+4? Do you like "A & B"');
  QueryPerformanceCounter(t4);

  Writeln(IntToStr(t2-t1));
  Writeln(IntToStr(t4-t3));

  Readln;


end.

Вывод:

532031
801969
18
ответ дан 28 November 2019 в 07:33
поделиться

Обычно я просто использую этот код:

function HTMLEncode(Data:string):string;
begin
  Result:=
    StringReplace(
    StringReplace(
    StringReplace(
    StringReplace(
    StringReplace(
      Data,
      '&','&amp;',[rfReplaceAll]),
      '<','&lt;',[rfReplaceAll]),
      '>','&gt;',[rfReplaceAll]),
      '"','&quot;',[rfReplaceAll]),
      #13#10,'<br />'#13#10,[rfReplaceAll]);
end;

(авторское право? Это открытый исходный код )

3
ответ дан 28 November 2019 в 07:33
поделиться

Похоже, это небольшой конкурс :) Вот еще одна реализация:

function HTMLEncode3(const Data: string): string;
var
  iPos, i: Integer;

  procedure Encode(const AStr: String);
  begin
    Move(AStr[1], result[iPos], Length(AStr) * SizeOf(Char));
    Inc(iPos, Length(AStr));
  end;

begin
  SetLength(result, Length(Data) * 6);
  iPos := 1;
  for i := 1 to length(Data) do
    case Data[i] of
      '<': Encode('&lt;');
      '>': Encode('&gt;');
      '&': Encode('&amp;');
      '"': Encode('&quot;');
    else
      result[iPos] := Data[i];
      Inc(iPos);
    end;
  SetLength(result, iPos - 1);
end;

Обновление 1: обновлено изначально с некорректным кодом.

Обновление 2: И время:

HTMLEncode :   2286508597
HTMLEncode2:   3577001647
HTMLEncode3:    361039770
13
ответ дан 28 November 2019 в 07:33
поделиться

Блок HTTPApp имеет функцию под названием HTMLEncode. Он также имеет другие функции, связанные с HTML/HTTP.

2
ответ дан 28 November 2019 в 07:33
поделиться
Другие вопросы по тегам:

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