![]() |
Text nach Umlauten parsen, knifflig?
Moin,
ich habe 2 Datenbanken, eine wo nur Strings hinterlegt sind, die andere wo auch Strings hinterlegt sind allerdings noch andere dazugehörige Informationen. Nun sind die Umlaute der Strings in der ersten Datenbank normal geschrieben, in der anderen als HTML Code also für "Ä" beispielsweise ä Das ist allerdings nicht einheitlich der Fall sondern es kann vorkommen, dass manche Umlaute im Klartext stehen andere im HTML Code. Das schlimmste ist aber, dass es auch Mischformen gibt, wie "Cäer kümmerte sich nicht" Ich möchte aus der ersten Datenbank den String entnehmen, suchen, ob der String in der anderen Datenbank vorhanden ist und die gefundenen Daten in eine neue Datenbank schreiben. Wenn es keine Mischformen gäbe, würde folgender einfachen Code reichen:
Delphi-Quellcode:
Wenn ich in der zweiten Datenbank nach s und s2 suchen würde, würden Strings gefunden, die ohne HTML Code vorhanden sind, als auch Strings, wo alle Umlaute durch HTML Code ersetzt sind.
S2:= s;
If ansiContainsText(s2, 'ä') then s2:= ansiReplaceText(s2, 'ä', 'ä'); If ansiContainsText(s2, 'ü') then s2:= ansiReplaceText(s2, 'ü', 'ü'); If ansiContainsText(s2, 'ö') then s2:= ansiReplaceText(s2, 'ö', 'ö'); If ansiContainsText(s2, 'ß') then s2:= ansiReplaceText(s2, 'ß', 'ß'); Aber wie finde ich nun die Mischformen?? Gruß Gambit |
Re: Text nach Umlauten parsen, knifflig?
Hi!
Warum geht nicht folgendes:
Delphi-Quellcode:
Oder hab ich da was falsch verstanden?
s2:=Stringreplace(s2, 'ß', 'ß', [rfReplaceAll, rfignoreCase]);
Ciao fkerber |
Re: Text nach Umlauten parsen, knifflig?
Das löst mein Problem mit den Mischformen doch aber nicht, oder?
Gruß Gambit |
Re: Text nach Umlauten parsen, knifflig?
Moin Gambit,
Zitat:
Du kannst doch alle gefundenen Sonderzeichen in ihre HTML Entsprechung überführen, die die HTML-Codes ja wiederum keine Sonderzeichen enthalten. |
Re: Text nach Umlauten parsen, knifflig?
OK, ich versuchs mal an einem Beispiel deutlich zu machen:
Angenommen in der ersten Datenbank steht der String: "Hägar lügt nie" Dann könnte es sein, das in der zweiten Datenbank folgender String steht, wenn er denn vorhanden ist: 1. "Häger lügt nie" also kein HTML Code oder 2. "Hägar lügt nie" also nur erstes Soderzeichen ist HTML Code oder 3. "Hägar lügt nie" nur zweites Sonderzeichen ist HTML Code oder 4. "Hägar lügt nie" alle Sonderzeichen sind HTML Code Wenn ein String 3 Umlaute enthält kann es noch weitaus mehr Möglichkeiten geben. Das es solche Inkonsequenzen in der zweiten Datenbank überhaupt giebt, liegt an dem Programmierer der HTML Seiten auf den ich leider keinen Einfluss habe. Hätte er konsequent alle Sonderzeichen in HTML geschrieben, gäbe es das Problem nicht und ich bräuchte auch keine 2 String-Variabeln in meinem Codebeispiel(s und s2). Mit meinem oben genannten Code Beispiel(also wenn ich alle Sonderzeichen austauschen würde) würde ich aber nur die erste und die letzte der 4 Möglichkeiten finden. Die Sache, mit zwei Strings(s und s2) ist ja auch nicht besonders pfiffig. Ich bräuchte eine Routine, die in einer Schleife den String so oft wie nötig ändert und immer wieder prüft, ob der String in der zweiten Datenbank vorhanden ist. Außerdem bräuchte die Schleife auch 'ne Abbruchbedingung für den Fall, dass der String gar nicht vorhanden ist. Ich hoffe, jetzt ist es verständlicher. Gruß und frohe Ostern Gambit |
Re: Text nach Umlauten parsen, knifflig?
Hi Gambit,
geht es so:
Delphi-Quellcode:
procedure ReplaceChar(var InOut : String; const UE : Char; const AE : String); var I : Integer; begin while POS(UE, InOut) <> 0 do begin I := POS(UE, InOut); Delete(InOut, I, 1); Insert(AE, InOut, I); end; end; Frohe Ostern |
Re: Text nach Umlauten parsen, knifflig?
ich hab' wohl etwas zu kompliziert gedacht, ich glaube es geht tatsächlich ganz einfach so wie fkerber es vorgeschlagen hat:
Delphi-Quellcode:
Meine ersten Tests sind ganz verheißungsvoll.
while found = false do
begin If s1=s2 then found:= true else begin s2:= Stringreplace(s2, 'ä', 'ä', [rfignoreCase]); s2:= Stringreplace(s2, 'ü', 'ü', [rfignoreCase]); s2:= Stringreplace(s2, 'ö', 'ö', [rfignoreCase]); s2:= Stringreplace(s2, 'ß', 'ß', [rfignoreCase]); end; end; Eigentlich ganz einfach. Danke! Gambit |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:30 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