Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Конвертирование HTML кодов типа "&" в символы / 14 сообщений из 14, страница 1 из 1
13.08.2018, 10:19
    #39686704
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертирование HTML кодов типа "&" в символы
Если в Delphi что-то готовое или самому изобретать колесо?
Может у InDy есть?
...
Рейтинг: 0 / 0
13.08.2018, 10:25
    #39686709
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертирование HTML кодов типа "&" в символы
Изобрети колесо. Задача сводится к нескольким StringReplace.
...
Рейтинг: 0 / 0
13.08.2018, 10:29
    #39686710
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертирование HTML кодов типа "&" в символы
X11,

Таких велосипедов море разливанное.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
function MakeSafeHTMLText(TheText: string): string;
var
  Idx: Integer; // loops thru the given text
begin
  Result := '';
  for Idx := 1 to Length(TheText) do
    case TheText[Idx] of
      '<':  // opens tags: replace with special char reference
        Result := Result + '&lt;';
      '>':  // closes tags: replace with special char reference
        Result := Result + '&gt;';
      '&':  // begins char references: replace with special char reference
        Result := Result + '&amp;';
      '"':  // quotes (can be a problem in quoted attributes)
        Result := Result + '&quot;';
      #0..#31, #127..#255:  // control and special chars: replace with encoding
        Result := Result + '&#' + SysUtils.IntToStr(Ord(TheText[Idx])) + ';';
      else  // compatible text: pass thru
        Result := Result + TheText[Idx];
    end;
end;
...
Рейтинг: 0 / 0
13.08.2018, 10:31
    #39686712
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертирование HTML кодов типа "&amp;" в символы
DarkMasterX11,

Таких велосипедов море разливанное.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
function MakeSafeHTMLText(TheText: string): string;
var
  Idx: Integer; // loops thru the given text
begin
  Result := '';
  for Idx := 1 to Length(TheText) do
    case TheText[Idx] of
      '<':  // opens tags: replace with special char reference
        Result := Result + '&lt;';
      '>':  // closes tags: replace with special char reference
        Result := Result + '&gt;';
      '&':  // begins char references: replace with special char reference
        Result := Result + '&amp;';
      '"':  // quotes (can be a problem in quoted attributes)
        Result := Result + '&quot;';
      #0..#31, #127..#255:  // control and special chars: replace with encoding
        Result := Result + '&#' + SysUtils.IntToStr(Ord(TheText[Idx])) + ';';
      else  // compatible text: pass thru
        Result := Result + TheText[Idx];
    end;
end;



У ТС вопрос был - как сделать наоборот )))
...
Рейтинг: 0 / 0
13.08.2018, 10:35
    #39686717
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертирование HTML кодов типа "&amp;" в символы
Вот что нашёл. Ещё не пробовал.
(автор уже прикрыл свой блог)

HTML Decode 1.1.2 - HTMLDecode.pas
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
{
  HTML Decode 1.1.2

  Copyright (C) 2011-2013, Kangreon.
  License: GNU/GPL, http://www.gnu.org/copyleft/gpl.html
  Author: Dmitry Zhilko
  Websites: http://kdcodes.blogspot.com/
}

unit HTMLDecode;

interface

uses
  Classes, SysUtils, StrUtils;

type
  THTMLDecode = class
  private
    FErrorResource: Boolean;
    FTagList: WideString;
    function ConvertTag(const tag: WideString): WideString;
    procedure ErrorResource;
    procedure GetTagList;
    function HTMLDecode(const Src: WideString): WideString;
    function TextToCode(const tag: WideString): WideString;
  public
    constructor Create;
    destructor Destroy; override;

    ///	<summary>
    ///	  Конвертирует HTML символы в обычные.
    ///	</summary>
    ///	<param name="InText">
    ///	  Строка, которую необходимо конвертировать
    ///	</param>
    ///	<returns>
    ///	  Строка, содержащая конвертированные HTML символы
    ///	</returns>
    function Convert(const InText: WideString): WideString;

    ///	<summary>
    ///	  Показывает, удалось ли загрузить ресурс, содержащий соответствия HTML
    ///	  и обычных символов.
    ///	</summary>
    property IsError: Boolean read FErrorResource;
  end;

// Ресурс, содержит в себе название символов и их коды
{$R htmldecode.RES}

implementation

const
  RT_RCDATA       = PChar(10);

{ THTMLDecode }

constructor THTMLDecode.Create;
begin
  FErrorResource := False;
  GetTagList;
end;

destructor THTMLDecode.Destroy;
begin
  FTagList := '';
  inherited;
end;

function THTMLDecode.Convert(const InText: WideString): WideString;
begin
  if FErrorResource then
    ErrorResource
  else
  begin
    Result := HTMLDecode(InText);
  end;
end;

function THTMLDecode.ConvertTag(const tag: WideString): WideString;
var
  t: WideString;
  StringInt: WideString;
  int, lt: Integer;
begin
  lt := Length(tag);

  { Возврат исходных данных }
  Result := '&' + tag + ';';

  if Length(tag) <> 0 then
    if tag[1] = '#' then
    begin

      { Является ли число шестнадцатиричным }
      if tag[2] = 'x' then
      begin
        { Копирование вероятного числа }
        StringInt := Copy(tag, 3, lt);
        {
          Является ли набор символов числом,
          и перевод str в int
        }
        if TryStrToInt('$' + StringInt, int) then
          Result := WideChar(int);
      end
      else
      begin
        StringInt := Copy(tag, 2, lt);
        if TryStrToInt(StringInt, int) then
          Result := WideChar(int);
      end;

    end
    else
    begin
      { Перевод текста в код }
      t := TextToCode(tag);

      if TryStrToInt(t, int) then
        Result := WideChar(int);
    end;
end;

procedure THTMLDecode.ErrorResource;
begin
  raise Exception.Create('Resource htmldecode.RES not found or corrupt.');
end;

procedure THTMLDecode.GetTagList;
var
  tmp: AnsiString;
begin
  try
    with TResourceStream.Create(0, 'TagList', RT_RCDATA) do
    try
      SetLength(tmp, Size);
      ReadBuffer(tmp[1], Size);
      FTagList := WideString(tmp);
      tmp := '';
    finally
      Free;
    end;
  except
    // Ошибка загрузки ресурса
    FErrorResource := True;
  end;
end;

function THTMLDecode.HTMLDecode(const Src: WideString): WideString;
var
  i, tz: Integer;
  oldPos: Integer;
  s: WideString;
  tag, nTag: WideString;
  newStr: WideString;
begin
  i := 1;
  oldPos := 1;
  s := Src;
  newStr := '';

  { Поиск всех вхождений символа & }
  while PosEx('&', s, i) <> 0 do
  begin
    i := PosEx('&', s, i) + 1;
    { Поиск позиции окончания HTML Tag }
    tz := PosEx(';', s, i);

    { Если после & уже нету ; то выход из цикла }
    if tz < i then
      Break;

    { Если ; находится дальше следующей & то пропустить }
    if PosEx('&', s, i) <> 0 then
      if tz > PosEx('&', s, i) then
        Continue;

    {
      Если HTML Tag получился очень длинным,
      пропускаем.
    }
    if tz - i > 35 then
      Continue;

    tag := Copy(s, i, tz - i);
    nTag := ConvertTag(tag);

    newStr := newStr + Copy(s, oldPos, i - oldPos - 1) + nTag;
    oldPos := tz + 1;
  end;

  Result := newStr + Copy(s, oldPos, Length(s));
end;

function THTMLDecode.TextToCode(const tag: WideString): WideString;
var
  i: Integer;
begin
  i := PosEx('&' + tag + ';', FTagList);
  if i > 0 then
  begin
    Inc(i, 3 + Length(tag));
    Result := Copy(FTagList, i, PosEx(' ', FTagList, i) - i);
  end
  else
    Result := '&' + tag + ';';
end;

end.

...
Рейтинг: 0 / 0
13.08.2018, 11:09
    #39686735
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертирование HTML кодов типа "&amp;" в символы
defecatorDarkMasterX11,

Таких велосипедов море разливанное.



У ТС вопрос был - как сделать наоборот )))

Значит нужно перевернуть или читать снизу вверх
...
Рейтинг: 0 / 0
13.08.2018, 11:12
    #39686737
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертирование HTML кодов типа "&amp;" в символы
HTTPApp.HTMLEncode
...
Рейтинг: 0 / 0
13.08.2018, 11:14
    #39686739
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертирование HTML кодов типа "&amp;" в символы
wadmanHTMLEncode

Тогда уж Decode
...
Рейтинг: 0 / 0
13.08.2018, 11:53
    #39686769
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертирование HTML кодов типа "&amp;" в символы
Не, это не годится.
Оно ругается на мнемокод двойной левой кавычки:



Web.HTTPApp.HTMLDecodeProject raised exception class EConvertError with message 'Invalid HTML encoded character (&l) at position 123'.
...
Рейтинг: 0 / 0
13.08.2018, 11:59
    #39686774
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертирование HTML кодов типа "&amp;" в символы
Вот ещё нашел. Но тоже выдаёт exception в случае неправильного кода. Тоже неудобно.

function HTMLDecode(const AStr: String): String;
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
function HTMLDecode(const AStr: String): String;
resourcestring
  sInvalidHTMLEncodedChar = 'Invalid HTML encoded character (%s) at position %d';
var
  Sp, Rp, Cp, Tp: PChar;
  S: String;
  I, Code: Integer;
begin
  SetLength(Result, Length(AStr));
  Sp := PChar(AStr);
  Rp := PChar(Result);
  Cp := Sp;
  try
    while Sp^ <> #0 do
    begin
      case Sp^ of
        '&': begin
               Cp := Sp;
               Inc(Sp);
               case Sp^ of
                 'a': if AnsiStrPos(Sp, 'amp;') = Sp then  { do not localize }
                      begin
                        Inc(Sp, 3);
                        Rp^ := '&';
                      end;
                 'r',
                 'l',
                 'g': if (AnsiStrPos(Sp, 'lt;') = Sp) or (AnsiStrPos(Sp, 'gt;') = Sp) then { do not localize }
                      begin
                        Cp := Sp;
                        Inc(Sp, 2);
                        while (Sp^ <> ';') and (Sp^ <> #0) do
                          Inc(Sp);
                        if Cp^ = 'l' then
                          Rp^ := '<'
                        else
                          Rp^ := '>';
                      end;
                 'q': if AnsiStrPos(Sp, 'quot;') = Sp then  { do not localize }
                      begin
                        Inc(Sp,4);
                        Rp^ := '"';
                      end;
                 '#': begin
                        Tp := Sp;
                        Inc(Tp);
                        while (Sp^ <> ';') and (Sp^ <> #0) do
                          Inc(Sp);
                        SetString(S, Tp, Sp - Tp);
                        Val(S, I, Code);
                        if I >= $10000 then
                        begin
                          // Decode surrogate pair
                          Rp^ := Char(((I - $10000) div $400) + $d800);
                          Inc(Rp);
                          Rp^ := Char(((I - $10000) and $3ff) + $dc00);
                        end
                        else
                          Rp^ := Chr((I));
                      end;
                 else
                   raise EConvertError.CreateFmt(sInvalidHTMLEncodedChar,
                     [Cp^ + Sp^, Cp - PChar(AStr)])
               end;
           end
      else
        Rp^ := Sp^;
      end;
      Inc(Rp);
      Inc(Sp);
    end;
  except

    on E:EConvertError do
      raise EConvertError.CreateFmt(sInvalidHTMLEncodedChar,
        [Cp^ + Sp^, Cp - PChar(AStr)])
  end;
  SetLength(Result, Rp - PChar(Result));
end;

...
Рейтинг: 0 / 0
13.08.2018, 12:50
    #39686808
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертирование HTML кодов типа "&amp;" в символы
XML-функции в Jedi Code Library
...
Рейтинг: 0 / 0
13.08.2018, 13:05
    #39686822
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертирование HTML кодов типа "&amp;" в символы
AriochJedi Code Library
не установлено и не буду
...
Рейтинг: 0 / 0
13.08.2018, 13:11
    #39686830
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертирование HTML кодов типа "&amp;" в символы
X11,

Ну можешь ещё THtmlView скачать :-)

Но то такэ, SGML entities - штука скользкая, где брать официяльный и самоновополнейший их список я не знаю.
У HTML версия много было....

А ещё есть XHTML (в XML можно свои собственные entities регистрировать)

В общем, решить задачу "на отвали" просто - StringReplace и понеслась.
А вот решить правильно... Хе-хе-хе....
...
Рейтинг: 0 / 0
13.08.2018, 13:39
    #39686852
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертирование HTML кодов типа "&amp;" в символы
пока оставил вот это 21640131
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Конвертирование HTML кодов типа "&amp;" в символы / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]