Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > удаление html тегов и кода html


Автор: Elfebet 29.9.2006, 18:00
пробовал функцию предложенную в дркб, но прога виснет если html текст выше 100 кб, посоветуйте плиз какой лучше применить способ отображения только тескта без html тегов?

Автор: Yanis 29.9.2006, 18:26
Цитата(Elfebet @  29.9.2006,  19:00 Найти цитируемый пост)
пробовал функцию предложенную в дркб, но прога виснет если html текст выше 100 кб, посоветуйте плиз какой лучше применить способ отображения только тескта без html тегов?

Загрузи его WebBrowser.

Автор: Elfebet 29.9.2006, 18:30
Цитата

Загрузи его WebBrowser. 

только не веббраузер. 

Автор: sOckets 29.9.2006, 18:40
А что искать в тексте теги и удалять их религия не позволяет или знаний не хватает ?

Автор: Yanis 29.9.2006, 18:41
Ну тогда RegExpr тебе в руки.

P. S. Я опередил бугора?

Автор: BUGOR 29.9.2006, 18:57
Yanis, может ты ещё и регулярку составишь?smile Давай кто первее, я тебе даю фору в сутки))

Автор: Zero 29.9.2006, 19:24
Цитата(sOckets @  29.9.2006,  19:40 Найти цитируемый пост)
А что искать в тексте теги и удалять их религия не позволяет или знаний не хватает ?

Врядли это быстрый способ.
А автору помоему нужно именно это... smile 

Автор: Alexeis 29.9.2006, 19:34
Цитата(Zero @  29.9.2006,  19:24 Найти цитируемый пост)
Врядли это быстрый способ.
А автору помоему нужно именно это... 

Как он будет работать это будет зависеть от реализации. Например, построчная реализания будет довольно быстрой. 
Простейший вариант это удалять все что в угловых скобках и заменить спец. символы на на их видимые аналоги.

Автор: sOckets 29.9.2006, 19:38
Цитата
Врядли это быстрый способ.
 нужно уметь писать , а если не умеешь учись уметь учиться писать smile

Автор: Elfebet 29.9.2006, 20:40
ну мне вообще-то надо найти несколько предложений (от 1 до 20) . так как цель поставили искать предложения до точки, нужно удалять ненужные теги, а то точка в тэгах частый символ и получается лабуда.

Автор: Fedia 30.9.2006, 09:39
Цитата(Elfebet @  29.9.2006,  20:40 Найти цитируемый пост)
нужно удалять ненужные теги, а то точка в тэгах частый символ и получается лабуда

Удалить теги можно например так:
Код

function DelTeg(s: string): string;
var
  i, j: integer;
begin
  repeat
    i:=Pos('<', s);
    if i>0 then
    j:=Pos('>', s);
    if (i>0) and (j>0) and (j>i) then
    delete(s, i, j - i + 1);
  until i = 0;
  Result:=s;
end;

Автор: BUGOR 30.9.2006, 10:29
Fedia, это очень тормозной вариант, на страничке весом всего 2КБ он у меня вообще завис.

Попробуй вот эту функцию:

Код

function DelTag(lpData: string): string;
var
exp: TRegExpr;
begin
  exp := TRegExpr.Create;
  exp.Expression := '<[^<>]+>';
  result := exp.Replace(lpData, '');
end;


На файле весом 100 Кб отработала за 5 секунд. 

Автор: Fedia 30.9.2006, 12:05
Цитата(BUGOR @  30.9.2006,  10:29 Найти цитируемый пост)
Fedia, это очень тормозной вариант, на страничке весом всего 2КБ он у меня вообще завис.

Конечно, я просто не доработал функцию, и из-за этого происходило зацикливание:
Код

function DelTeg(s: string): string;
var
  i, j: integer;
begin
  repeat
    i:=Pos('<', s);
    if i>0 then
    j:=Pos('>', s);
    if (i>0) and (j>0) then
    if (j>i) then
    delete(s, i, j - i + 1) else
    begin
      Result:=Result + Copy(s, 1, j);
      delete(s, 1, j)
    end;
  until (i = 0) or (j = 0);
  Result:=Result + s;
end;

Попробуй этот вариант. Обрабатывает данную страницу форума менее чем за секунду.

Добавлено @ 12:07 
Цитата(BUGOR @  30.9.2006,  10:29 Найти цитируемый пост)
На файле весом 100 Кб отработала за 5 секунд. 

Ты обещал Yanis-у подождать сутки. Слово нужно держать  smile 

Автор: Alexeis 30.9.2006, 15:07
ребята вы забыли, что в тексте html символы
&lt; &gt; надо заменить на "<" ">"

Причем это не все спец. символы. Откройте справочник по HTML...
Их там может быть более сотни. Их обычно заменяет браузер. 

Автор: BUGOR 30.9.2006, 15:30
Fedia, я не сомневался, что на стандартных функциях работать будет быстрее, зато какая элегнтость достигается с использованием regexpr, хотя я бы использовал твой вариант, скорость решает в данном случае.

Цитата

Ты обещал Yanis-у подождать сутки. Слово нужно держать


Каюсь smile

Автор: Fedia 30.9.2006, 23:04
Цитата(BUGOR @  30.9.2006,  15:30 Найти цитируемый пост)
зато какая элегнтость достигается с использованием regexpr

С этим не поспоришь. Разработчики TRegExpr потрудились на славу. Думаю, если бы они решали задачу исключительно удаления тегов, то преодолеть скоростные характеристики их решения было бы трудновато.
Elfebet, если уж вопрос стоит так: 
Цитата

какой лучший способ и быстрый?
, то для ускорения моей функции могу посоветовать поискать ускоренные аналоги стандартной функции Pos.

Автор: BUGOR 1.10.2006, 06:24
Цитата

то для ускорения моей функции могу посоветовать поискать ускоренные аналоги стандартной функции Pos.


Вряд ли это возможно, pos написана в виде ассемблерной вставки и довольно хорошо оптимизирована, может ты быть её можно ускорить на какие-то 10%, но это надо очень прилично извратиться имхо, а смысла в этом особого нет.

Автор: Fedia 1.10.2006, 06:45
Цитата(BUGOR @  1.10.2006,  06:24 Найти цитируемый пост)
Вряд ли это возможно, pos написана в виде ассемблерной вставки и довольно хорошо оптимизирована, может ты быть её можно ускорить на какие-то 10%

Где-то с 1-1.5 года назад на др. форуме встречал ссылку на рейтинг функций, аналогов Pos. Рейтинг выставлялся в зависимости от скорости поиска субстроки в заранее разработанных тестовых примерах. Разница по скорости у топовых функций по сравнению со стандартной Pos была значительна (точно не помню процентных соотношений, но более 10% точно). При реализации этих функций разработчики делали акцент не только на ассемблере, но и на модификации алгоритма поиска.

Автор: Quadr0 1.10.2006, 22:35
...

Автор: Fedia 1.10.2006, 23:02
Цитата(Quadr0 @  1.10.2006,  22:35 Найти цитируемый пост)
Причём происходит это каждую итерацию цикла. На крайняк надо уж concat использовать.

Каждую итерацию цикла ? Код внимательно смотрел ?

Автор: Quadr0 1.10.2006, 23:06
...

Автор: Fedia 1.10.2006, 23:14
Цитата(Quadr0 @  1.10.2006,  22:35 Найти цитируемый пост)
Вот такие действия приводят к большим перераспределниям памяти, потому как в памяти образуется новая строка, куда копируются две остальные.

Цитата(Quadr0 @  1.10.2006,  23:06 Найти цитируемый пост)
То код уже не оптимален.

Согласен, но случаи, когда используется эта строчка кода достаточно редки, поэтому ее оптимизацией я пренебрег.
Цитата(Quadr0 @  1.10.2006,  22:35 Найти цитируемый пост)
Около 50 МБ HTML'a конвертит менее минуты. 

Попробую потестить.

Автор: Fedia 2.10.2006, 02:29
Цитата(Quadr0 @  1.10.2006,  22:35 Найти цитируемый пост)
Около 50 МБ HTML'a конвертит менее минуты.

Твой вариант на самом деле оказался фантастически быстр. Пару часов я пытался доработать свою функцию, пытаясь преодолеть скоростную планку твоей. Но как оказалась только применение Pos из моей функции работает дольше всей твоей функции целиком, не говоря уже об остальной части с delete, Copy, сложением строк и т.д. Твоя функция работала в пару сотен раз быстрее smile
Поэтому я решил вообще написать функцию с нуля другим способом, без сдвигов и копирований: 
Код

function DelTeg(s: String): String;
var
  InTeg: Boolean;
  i, len, NotInTegC: Integer;
begin
  len:=Length(s); NotInTegC:=0; InTeg:=False;
  SetLength(Result, len);
  for i:=1 to Length(s) do
  begin
    if s[i]='<' then
    InTeg:=True else
    if InTeg and (s[i]='>') then
    InTeg:=False else
    if not InTeg then
    begin
      Inc(NotInTegC);
      Result[NotInTegC]:=s[i];
    end;
  end;
  SetLength(Result, NotInTegC);
end;
 и с Божьей помощью удалось преодолеть скоростные характеристики твоей функции в несколько раз  smile 

Автор: Elfebet 2.10.2006, 11:05
Fedia, Quadr0, ребята ну спасибки вам smile 
зы Fedia +1
Quadr0 +1

Автор: Fedia 2.10.2006, 11:22
Цитата(Yanis @  2.10.2006,  10:14 Найти цитируемый пост)
Fedia, спасибо за замечание

Всегда пожалуйста smile

Цитата(Elfebet @  2.10.2006,  11:05 Найти цитируемый пост)
Fedia, Quadr0, ребята ну спасибки вам  
зы Fedia +1
Quadr0 +1

И почему "+" так приятно получать ?  smile

Автор: Quadr0 2.10.2006, 13:07
...

Автор: Fedia 3.10.2006, 00:14
Цитата(Quadr0 @  2.10.2006,  13:07 Найти цитируемый пост)
куча проверок на условия - зло

Это не самое страшное зло smile

Цитата(Quadr0 @  2.10.2006,  13:07 Найти цитируемый пост)
От меня плюс за не лень.

Спасибо !

Автор: BetaCoder 5.4.2009, 09:16
А как в последнем коде сделать чтобы кроме начального и завершающего тега <  и  >  отсеивался еще  { и } ,   [ и  ] и такая конструкция & и ; ? Это актуально для форумов, там же ВВ коды, их тоже как-но надо отсеивать.

Ну не копировать же под каждый тег свою функцию...

Автор: MetalFan 5.4.2009, 16:24
BetaCoder, некрофил чтоли? ))

Автор: Alix 6.4.2009, 15:20
На скорую руку:
Код
function DelTags(s: String): String;
var
  i,
  len,
  currentPos: Integer;

begin
  len := Length(s);
  currentPos := 1;

  SetLength(Result, len);

  i := 1;
  while i <= len do
  begin
    case s[i] of
      '<':
        begin
          inc(i);
          while (s[i] <> '>') and (i < len) do
            inc(i);
        end;

      '{':
        begin
          inc(i);
          while (s[i] <> '}') and (i < len) do
            inc(i);
        end;

      '[':
        begin
          inc(i);
          while (s[i] <> ']') and (i < len) do
            inc(i);
        end;

      '&':
        begin
          inc(i);
          while (s[i] <> ';') and (i < len) do
            inc(i);
        end

      else
      begin
        result[currentPos] := s[i];
        inc(currentPos);
      end;
    end;

    inc(i);
  end;

  SetLength(Result, currentPos - 1);
end;
Вот только нафига удалять столько всего нужного... И оставлять столько ненужного (например скрипты между <script>).

Автор: BetaCoder 6.4.2009, 15:31
Нужного-ненужного...
А если у вас программа для загрузки РСС, что по вашему, пользователям интересно будет смотреть не на текст сообщения, а на всякие '[b' & nbsp h} и прочую лабуду...

Спасибо кстати за код =) Пригодился

Автор: Alix 7.4.2009, 11:47
Цитата(BetaCoder @  6.4.2009,  15:31 Найти цитируемый пост)
А если у вас программа для загрузки РСС, что по вашему, пользователям интересно будет смотреть не на текст сообщения, а на всякие '[b' & nbsp h} и прочую лабуду...

Может и неприятно, но всякие &nbsp; можно бы и в пробелы превратить и т.д. по аналогии.

Автор: PumaSport 14.8.2011, 19:27
а можете скинуть пример? 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)