Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi html code parsen (https://www.delphipraxis.net/128975-html-code-parsen.html)

Matthias-k 10. Feb 2009 14:32


html code parsen
 
hi leutz,

ich suche verzweifelt ne möglichkeit oder eine kompo, wo ich html quelltext parsen kann.

und zwar brauch ich nur den reinen text. das ansich ist kee großes problem, kann man ja per pos copy usw
rausholen! mein problem an der ganzen sache ist, das es vorkommen kann, das ein "<" oder ">" in dem text vorkommen kann!
ich geb euch mal ein beispiel:

Code:

<div class="sysmsg">23:17:00 [b]<font color="#5a88ff">honigbiene</font> verl&auml;sst den Chat.[/b]</div>
<script type="text/javascript">scroll();</script>
<script type="text/javascript">prescroll();</script>
<script type="text/javascript">parent.updateUser('Delphi', 4, 0, 0);</script><script type="text/javascript">scroll();</script>
<script type="text/javascript">prescroll();</script>
<div class="text" style="color:#0000ff;">(<span style="cursor:pointer;" onclick="parent.clickNick('Delphi',event);" style="color: #0000ff;">Delphi</span>) &lt;&lt;&lt;&lt;>>>>>></div>
<script type="text/javascript">scroll();</script>
<script type="text/javascript">prescroll();</script>

<script type="text/javascript">scroll();</script>
<script type="text/javascript">prescroll();</script>
<script type="text/javascript">parent.updateUser('Delphi', 4, 1, 0);</script><script type="text/javascript">scroll();</script>
<script type="text/javascript">prescroll();</script>
unnötige zeilen wie
Code:
<script type="text/javascript">scroll();</script>
<script type="text/javascript">prescroll();</script>
werden bereits entfernt beim auslesen. gibts irgendwas, was mir nur den reinen text ausgibt?

mfg matthias

RWarnecke 10. Feb 2009 14:49

Re: html code parsen
 
Den folgenden Sourcecode habe ich mal gefunden :
Delphi-Quellcode:
// Extract plain text from html string

function StripHTMLTags(const strHTML: string): string;
var
  P: PChar;
  InTag: Boolean;
  i, intResultLength: Integer;
begin
  P := PChar(strHTML);
  Result := '';

  InTag := False;
  repeat
    case P^ of
      '<': InTag := True;
      '>': InTag := False;
      #13, #10: ; {do nothing}
    else
      if not InTag then
       begin
         if (P^ in [#9, #32]) and ((P+1)^ in [#10, #13, #32, #9, '<']) then
         else
           Result := Result + P^;
       end;
    end;
    Inc(P);
  until (P^ = #0);

  {convert system characters}
  Result := StringReplace(Result, '"', '"', [rfReplaceAll]);
  Result := StringReplace(Result, '&apos;', '''', [rfReplaceAll]);
  Result := StringReplace(Result, '>',  '>', [rfReplaceAll]);
  Result := StringReplace(Result, '<',  '<', [rfReplaceAll]);
  Result := StringReplace(Result, '&', '&', [rfReplaceAll]);
  {here you may add another symbols from RFC if you need}
end;
erstellt durch Code-Orakel und dem BBCode-Plugin.

Vielleicht hilft er Dir ja weiter.

Bernhard Geyer 10. Feb 2009 15:02

Re: html code parsen
 
Entweder du nimmst den parser des IE (TWebBrowser -> Document und Einbinden von MSHTML.pas) oder versuchst die Decodierung mit dem HTML-Viewer von PBear

SirThornberry 10. Feb 2009 15:05

Re: html code parsen
 
wenn in deinem zu parsenden wirklich außerhalb von Tags "<" und ">" vorkommen ist es kein wirklicher HTML-Code. Da hat sich irgendjemand nicht an Standards gehalten.
In oben gezeigtem Fall kann es sogar ein Sicherheitsrisiko werden da es so ausiseht als ob man damit anderen Leuten im Chat HTML-Code vorsetzen kann und somit auch Scripte.

Wenn man das ganze trotzdem parsen will braucht man eigentlich nur mit dem Gedanken ran gehen: Woran erkenne ich als Mensch das diese "<" und ">" in bestimmten Fällen kein einleiten oder schließen eines Tags ist.

Matthias-k 10. Feb 2009 18:38

Re: html code parsen
 
ich hab mit eurer hilfe eine ganz nützliche function gefunden:

Delphi-Quellcode:
function HtmlToText(const _html: string): string;var WebBrowser: TWebBrowser;
   Document: IHtmlDocument2;
   Doc: OleVariant;
   v: Variant;
   Body: IHTMLBodyElement;
   TextRange: IHTMLTxtRange;
begin
   Result := '';

   WebBrowser := TWebBrowser.Create(nil);
   try
     Doc := 'about:blank';
     WebBrowser.Navigate2(Doc);
     Document := WebBrowser.Document as IHtmlDocument2;

     if (Assigned(Document)) then
     begin
       v := VarArrayCreate([0, 0], varVariant);
       v[0] := _html;
       Document.Write(PSafeArray(TVarData(v).VArray));
       Document.Close;

       Body := Document.body as IHTMLBodyElement;
       TextRange := Body.createTextRange;
       Result := TextRange.text;
     end;
   finally
     WebBrowser.Free;
   end;
end;
jetzt muss ich bloß noch rausfinden, wieso der mir so einen script fehler ausgibt und wie ich das unterbinden kann!

mfg matthias


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz