Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Ersetzen von Dezimalwerten (https://www.delphipraxis.net/11339-ersetzen-von-dezimalwerten.html)

Jan 4. Nov 2003 18:04


Ersetzen von Dezimalwerten
 
Hallo DP,
ich lese eine HTML-Datei aus und habe dabei das Problem, dass Umlaute und andere Sonderzeichen in dieser Form: & # 226 ; (ohne leerzeichen) im HTML-Text vorhanden sind.
Gibt es einen einfachen Befehl um in einem String sämtliche solcher Vorkommnisse in ihre String-Entsprechungen umzuwandeln, oder muss ich wirklich alles mit stringreplace einzeln abfragen?
Gruß
Jan

Duffy 4. Nov 2003 18:52

Re: Ersetzen von Dezimalwerten
 
Hallo Jan,
was hat deine Frage mit dem Titel "Ersetzen von Dezimalwerten" zu tun? der Titel sollte besser "Ersetzen von Sonderzeichen" oder ähnlich lauten.
bye
Claus

Jan 4. Nov 2003 19:26

Re: Ersetzen von Dezimalwerten
 
226 ist in oben genanntem Beispiel die Dezimale (ASCII) Entsprechung für ein Sonderzeichen.

Luckie 4. Nov 2003 19:26

Re: Ersetzen von Dezimalwerten
 
Was mir da immer als erstes durch den Kopf schießt ist StringReplace. :roll:

Jan 4. Nov 2003 19:28

Re: Ersetzen von Dezimalwerten
 
Zitat:

Gibt es einen einfachen Befehl um in einem String sämtliche solcher Vorkommnisse in ihre String-Entsprechungen umzuwandeln, oder muss ich wirklich alles mit stringreplace einzeln abfragen?
Ja, hab ich ja auch schon vorher dran gedacht, aber für all die Sonderzeichen ein eigenes Stringreplace? das ist aber ziemlich unschön.
Gruß
Jan

Christian Seehase 4. Nov 2003 19:38

Re: Ersetzen von Dezimalwerten
 
Moin Jan,

sonst bliebe z.B. noch die Möglichkeit, dass Du Dir einen, zumindest, rudimentären Parser für HTML, bzw. die extrahierten Texte, schreibst, und auf eine entsprechende Zeichenkombination triffst diese ersetzt.
Das dürfte zumindest schon einmal einiges schneller gehen, da die Daten sich dann in einem Durchgang umwandeln liessen.

Jan 4. Nov 2003 19:42

Re: Ersetzen von Dezimalwerten
 
Das wäre ja nichts anderes als eine Funktion an welche ich einen String übergebe, diese Funktion wendet mehrere Stringreplaces an und gibt den neuen Wert zurück.
Naja ich hatte gehofft es gibt da so einen Befehl wie bei php (htmlspecialchars) nur für Sonderzeichen, aber da dem ja nicht so ist muss ich wohl oder übel diese unsägliche Funktion schreiben.
Gruß
Jan

Luckie 4. Nov 2003 19:46

Re: Ersetzen von Dezimalwerten
 
PHP ist ja auch eine Websprache, dass es da sowas gibt sollte man meinen. Aber Delphi ist ja eine richtige Programmiersprache.

Christian Seehase 4. Nov 2003 19:47

Re: Ersetzen von Dezimalwerten
 
Moin Jan,

Zitat:

Zitat von Jan
...diese Funktion wendet mehrere Stringreplaces an ...

nicht so wie ich das meine.
Wenn mehrere StringReplace nacheinander aufgerufen werden, wird ja jedesmal der gesamte Inhalt durchgegangen.
Nimmst Du hingegen einen Parser, kannst Du das, ohne StringReplace, in einem Durchgang erledigen.
Such' dazu am besten mal nach Hier im Forum suchenEndlicher Automat/Bei Google suchenEndlicher Automat

Jan 4. Nov 2003 20:00

Re: Ersetzen von Dezimalwerten
 
Hallo Christian,
was ein Endlicher Automat ist weiß ich natürlich (das war doch der langweilige Teil in Informatik Klasse 13, oder? :mrgreen: ).
Das war noch geil, wie uns unser Lehrer Händefuchtelnd am Beispiel eines Zigarettenautomaten einen Endlichen Automaten beigebracht hat und dazu tatsächlich 1 1/2 Stunden gebraucht hat...
Naja zurück zum Thema:
Ich soll also Wort für Wort den String durchgehen, bis ich dann auf ein Vorkommen eines Sonderzeichens Stoße, oder wie habe ich das zu verstehen?

Gruß
Jan

Christian Seehase 4. Nov 2003 20:05

Re: Ersetzen von Dezimalwerten
 
Moin Jan,

nein, Zeichen für Zeichen.
Ist Deine Basis jetzt schon der extrahierte Text, oder noch die HTML Datei?

Jan 5. Nov 2003 12:37

Re: Ersetzen von Dezimalwerten
 
Hallo Christian,
ich habe bereits alles extrahiert was ich haben will, das einzige was halt noch stört sind die Sonderzeichen.
Am besten mache ich das doch so, dass ich jedes Wort checke, ob es in einem Satz von Werten, die ich vorher deklariere enthalten ist, oder nicht?
Gruß
Jan

Christian Seehase 5. Nov 2003 21:22

Re: Ersetzen von Dezimalwerten
 
Moin Jan,

ich denke mal, Du könntest "einfach" Zeichen für Zeichen durchgehen.
Ist es ein Zeichen <> &, wird es direkt in den Zielbuffer übernommen, ansonsten suchst Du Dir ab dieser Stelle alle Zeichen bis zum nächsten ; raus.
Als Ergebnis für diesen Teilstring müsste jetzt (jeweils ohne Blank nach dem & versteht sich) & amp; / & lt; / & gt; / & quot; / & nbsp; oder & #nnn; rauskommen, da ja auch die Zeichen & / < / > / " und non breaking Space als Sonderzeichen kodiert sind (mehr als diese fünf fallen mir jetzt nicht ein). Den numerischen Wert könntest Du dabei einfach als chr(nnn) in den Zielbuffer schreiben, und die anderen durch eine Abfrage welcher String es ist, und dann das jeweilige Zeichen. Anschliessend steht der Quellindex hinter dem ; und das übersetzte Zeichen im Zielbuffer.
Geht allemal schneller als ein wiederholtes StringReplace, was auch zu Übersetzungsfehlern führen kann, weil dann umgewandelte Zeichen wiederrum Umwandelbare Zeichenkombinationen bilden können, was je eindeutig falsch wäre.
Du müsstest jetzt nur noch Fehler abfangen, denn es könnten ja auch Fehler in der Datei enthalten sein, z.B. ein einzelnes & was eigentlich als & amp; hätte enthalten sein müssen.

Jan 6. Nov 2003 20:03

Re: Ersetzen von Dezimalwerten
 
Hi Christian,
ich hab da mal was gebastelt, was auch funktioniert.
Für die Nachwelt:


Delphi-Quellcode:
function Specialchars(intext:string):string;
var
    i, p: integer;
begin
  i:=1;
  while (not (i>length(intext))) do
  begin
    if intext[i]='&' then
    begin
      if intext[i+1]='#' then
      begin
        p:=pos(';', intext);
        if p<i+8 then
        intext:=copy(intext,1,i-1)+char(strtoint(copy(intext,i+2,p-(i+2))))+copy(intext,p+1,length(intext)-p);
      end;
    end;
    inc(i);
  end;
  result:=intext;
end;
Ist das so in ordnung, oder kann man das noch irgendwie gewinnbringend optimieren?
Gruß
Jan

Christian Seehase 6. Nov 2003 20:12

Re: Ersetzen von Dezimalwerten
 
Moin Jan,

ich würde mal behaupten, dass das unter Umständen schief geht.
Wer sagt denn, dass ein ; nur als Kennzeichen für das Ende einer & #nnn; Darstellung dient?
Noch gemeiner: Wenn der numerische Code = 59 ist, wird ein ; in den Text eingefügt, und schon stimmt das mit dem Pos auch nicht mehr.

Initialisiere lieber Result auf einen String mit der Länge des Eingabestrings (z.B. auf Blank), und füge Zeichen für Zeichen dort ein. Triffst Du auf ein & im Quellstring, merk Dir dessen Position und suche nach dem nächsten ;
Dann kannst Du den Wert dazwischen auswerten, und ins Ziel übertragen.
Der Wert muss ja nicht zwingend numerisch sein & amp; könnte z.B. auch vorkommen, und müsste entsprechend übersetzt werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:03 Uhr.

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