usuwanie tagów HTMLa ze zmiennej typu string

0

Widziałem już różne tego wersje, ale niestety wszystkie były trefne. Jak wiadomo, najlepsze jest rozwiązanie własne :):), dlatego wziełem się za to i...

function TForm1.DelHtmlTags(s: string): string;
var
  i,j,k: integer;
  label label1;

begin
  j:=1;
  label1:
  for i :=j to length(s)-1 do
 if s[i] = '<' then
 begin
   for k := i+1 to length(s)-1 do
   begin
     if s[k] = '>' then
     begin
       Delete(s, i, k-i+1);
       j := k+1;
       goto label1;
     end
     else if s[k] = '<' then
     begin
       j:=k+1;
       goto label1;
     end;
   end;
 end;
Result := s;
end;

I niby wszystko dobrze, i rzeczywiście działa, ale niestety dla krótkiego tekstu. Jak jakiś dłuższy to już zostawia niektóre tagi nie mam pojęcia dlaczego. Przypuszczam, że chodzi o tę linię:

<font color="blue">Delete(s, i, k-i+1);</span>

Która realnie skraca zmienną string, ale czy teraz "length(s)" jest dalej tę wielkością czy tą nową... jeśli mnie rozumiecie :)

???

0

piszę z pamięci, więc bez bicia proszę..

function remTag(text : string) : string;
var  i : word;
      kasuj : boolean;

begin
       kasuj := false;
       for i := 1 to length(text) do begin
          if text[i] = '<' then kasuj := true;
          if not kasuj then result := result + text[i];
          if text[i] = '>' then kasuj := false;
       end;
end;


Pozdrawiam..

[dop] sprawdzone, działa wyśmienicie...
btw. Detox, nie mam pojęcia czemu tak namieszałeś w swoim kodzie.. i jeszcze te labale.. zgroza..

0

AndRew - dziala dziala, tylko ze usuwa tez znaki '<' z tekstu i nie usuwa znaku '>' na koncu, ale jak na swoja prostote to ok. Nad porzadna funkcja trzebaby sie chyba sporo nameczyc. Np. nie moglaby usuwac pierwszego znaku z takiego tekstu: '<< tag >', bo to juz nie jest czesc taga. Funkcja Detoxa (chociaz nie dziala jak planowal) gdyby ja poprawil moglaby byc lepsza, bo 'odroznia' tego typu sytuacje.
Pozdrowka ;-)

0

I właśnie oto mi chodziło.. skasować wszystko między <font color="blue"><</span> i <font color="blue">></span> to każdy umie :-/

0

w takim razie przerobimy troszkę tę funkcję do takiej postaci :

function remTag(text : string) : string;
var  i : word;
      kasuj : shortint;

begin
       kasuj := 0;
       for i := 1 to length(text) do begin
          if text[i] = '<' then inc(kasuj);
          if kasuj = 0 then result := result + text[i];
          if text[i] = '>' then dec(kasuj);
       end;
end;

teraz nawet taka funkcja :

remTag('ala ma kota, 1<tag> 2<tag2> 3<<ee>> 4<tak numer <4> <4.2>> 5<piąty tag> <tralalala> <<<raz dwa trzy>>> koniec')

zwróci nam taki ciąg : ala ma kota, 1 2 3 4 5 koniec

A co do NSP : nie zapomnij o sktótach SHITT+INS, +DEL, +HOME, +END, +PGUP, +PGDOWN - czyli wkejanie, wycinanie i zaznaczanie.

0

Może to coś pomoże... ?

function DelHtmlTags(s: String): String;
const
  Tab = ['!','/','?','A'..'Z','a'..'z'];
var
  l, r : Integer;
begin
  l := Pos('<', s);
  while l > 0 do begin
    Result := Result + Copy(s, 1, l - 1);
    Delete(s, 1, l - 1);
    r := Pos('>', s);
    if r = 0 then Break;
    if s[2] in Tab then
      Delete(s, 1, r)
    else begin
      Result := Result + s[1];
      Delete(s, 1, 1);
    end;
    l := Pos('<', s);
  end;
  Result := Result + s;
end;

Tablica Tab składa się ze znaków które według IE
rozpoczynają prawdziwy znacznik html, ale można
ją sobie zmodyfikować...

1 użytkowników online, w tym zalogowanych: 0, gości: 1