![]() |
Problem mit Pos/PosEx
Hallo,
durch folgenden Beitrag habe ich Hilfe im Umgang mit Pos/PosEx bekommen: ![]() Nun habe ich ein weiteres Problem, welches für mich wieder total unlogisch erscheint. Ich versuche aus einem Text Stellen zu entfernen, nach ähnlichem Schema wie in dem anderen Beitrag. Eigentlich sollte es durch ändern des Codes sehr leicht klappen. Aber Pos/PosEx schießt über das Ziel hinaus.
Code:
Aus diesem String versuche ich
'[[Hamburg]] || 2008 ||data-sort-value="Diplomica"| [[Diplomica Verlag|Verlagsgruppe Diplomica]] || Belletristik, Sachbuch'
Code:
zu löschen. Ich kenne aber nur die Teilstrings:
|data-sort-value="Diplomica"
Code:
Mit folgendem Code klappt es leider nicht bei mir:
1. |data-sort-value="
2. " // das ist das zweite Gänsefüßchen
Delphi-Quellcode:
Hier steht dann bei mir
var
sText: String; sRemoveText: String; Pos1: Integer; Pos2: Integer; Pos3: Integer; begin sText := '[[Hamburg]] || 2008 ||data-sort-value="Diplomica"| [[Diplomica Verlag|Verlagsgruppe Diplomica]] || Belletristik, Sachbuch'; try while stext.Length > 0 do begin Pos1 := Pos('||data-sort-value="', stext,1); Pos2 := Pos('"', stext, Pos1+1 ); // oder PosEx nutzen, ist aber in meiner Version gleich sRemoveText := Trim(Copy(stext, Pos1, Pos2-pos1)); Pos3 := Pos(slinebreak, sRemoveText); if Pos3 > 0 then sRemoveText := Trim(Copy(sRemoveText, 1, Pos3 - 1)); if sRemoveText.Length = 0 then break; stext := StringReplace(stext, sRemoveText, '', [rfReplaceAll, rfIgnoreCase]); end; finally result := true; end;
Code:
in sRemoveText drin.
'||data-sort-value="Diplomica"| [[Diplom'
Ich begreife es einfach nicht. LG Mathias Anmerkung: Pos = PosEx seit einiger Zeit, daher steht oben nur Pos() im Code. ![]() Die Lösung zum Problem habe ich dann doch gefunden: ![]() |
AW: Problem mit Pos/PosEx
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
program Project13;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; const derText = '[[Hamburg]] || 2008 ||data-sort-value="Diplomica"| [[Diplomica Verlag|Verlagsgruppe Diplomica]] || Belletristik, Sachbuch'; // |data-sort-value="" soll raus var i: Integer; Pos1, Pos2: Integer; s: string; begin try Pos1 := Pos('|data-sort-value="', derText, 1); Pos2 := Pos('"|', derText, Pos1 + 1) + 2; WriteLn(derText); s := Copy(derText, 1, Pos1); s := s + Copy(derText, Pos2, Length(derText)); WriteLn(''); WriteLn(s); ReadLn; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. |
AW: Problem mit Pos/PosEx
Ungefähr sowas? (nur hingedaddelt ala Delphi 7)
Delphi-Quellcode:
Sollte aus einem gegebenen Text auch andere Fragmente entfernen können.
function GetText(sText : string; sData : String; cDelim : Char) : String;
var iPos1 : Integer; iPos2 : Integer; iData : Integer; begin // Länge des zu entfernenen Textes zuzüglich Delimiter ermitteln: iData := Length(sData + cDelim); // '[[Hamburg]] || 2008 ||data-sort-value="Diplomica"| [[Diplomica Verlag|Verlagsgruppe Diplomica]] || Belletristik, Sachbuch'; // Position von ||data-sort-value=" ermitteln: iPos1 := Pos(sData,sText); // Alles hinter dieser Position plus der Länge von ||data-sort-value=" holen: // Diplomica"| [[Diplomica Verlag|Verlagsgruppe Diplomica]] || Belletristik, Sachbuch sData := Copy(sText,iPos1 + ciData,Length(sText)); // Die Position von " ermitteln: iPos2 := Pos(cDelim,sData); // Alles ab der 1. Stelle hinter dieser Postion holen: // | [[Diplomica Verlag|Verlagsgruppe Diplomica]] || Belletristik, Sachbuch sData := Copy(sData,iPos2 + 1,Length(sData)); // Aus dem Ursprungstext alles vor der Positon holen: // '[[Hamburg]] || 2008 sText := Copy(sText,1,iPos1 - 1); // Den ersten Teil des Ursprungstexte und den hinteren Teil zusammenfügen: Result := sText + sData; end; begin sText := '[[Hamburg]] || 2008 ||data-sort-value="Diplomica"| [[Diplomica Verlag|Verlagsgruppe Diplomica]] || Belletristik, Sachbuch'; sText := GetText(sText, '||data-sort-value=','"'); end; |
AW: Problem mit Pos/PosEx
Vielen Dank euch beiden!
Dennoch verstehe und erkenne ich leider meinen Fehler nicht. LG Mathias |
AW: Problem mit Pos/PosEx
Delphi-Quellcode:
// Pos1 ist die Position des Ersten | in ||data-sort-value="
Pos1 := Pos('||data-sort-value="', stext,1); // Pos1 + 1 ist die Position des Zweiten | in ||data-sort-value=" // Damit wird Pos2 die Position des gleichen " enthalten, wie Pos1. Pos2 := Pos('"', stext, Pos1+1 ); // oder PosEx nutzen, ist aber in meiner Version gleich // Es muss aber ab der Position Pos1 + der Länge von ||data-sort-value=" + 1 weitergesucht werden. Pos2 := Pos('"', stext, Pos1 + Length(||data-sort-value=") + 1); // sollte funktionieren |
AW: Problem mit Pos/PosEx
Zitat:
Ich habe nun versucht eure beiden Codes zusammenzufügen, weil ich eigentlich nicht den Text drum herum benötige, sondern den Suchtext aus dem Text entfernen möchte. Mein eigentlicher Text ist dieser: ![]() Alles, was in der Textbox auf der Webseite steht, soll umgewandelt werden. Doch vorher möchte ich diese störenden Tags entfernen.
Delphi-Quellcode:
function GetText(var stext: string; SearchTextA, SearchTextB: String; var Dummy_StringList: TStringList): boolean;
var Pos1: Integer; Pos2: Integer; Data: Integer; Dummy_String: String; begin try while (Length(stext) > 0) and (stext <> SearchTextA) do begin Pos1 := Pos(SearchTextA, stext, 1); Pos2 := Pos(SearchTextB, stext, Pos1 + 1) + Length(SearchTextA); Dummy_String := Copy(stext, Pos1, Pos2); // Hier sollte doch nun eigentlich (z.B. data-sort-value="Diplomica" drin stehen. Tut es aber nicht, weil das zweite Suchargument (" bzw. "| nicht gefunden wurde. Der überspringt das einfach. Delete(stext,pos1,pos2); // das sollte bitte eigentlich auch funktionieren.. ? Dummy_StringList.Add( Dummy_String); // Als Test für mich, wird momentan nur im Debugger geprüft end; finally result := true; end; end; |
AW: Problem mit Pos/PosEx
Liste der Anhänge anzeigen (Anzahl: 1)
Hier mal ein Screenshot vom Debugger.
|
AW: Problem mit Pos/PosEx
Mir scheint, dass diese Zeile falsch ist.
Delphi-Quellcode:
Pos2 := Pos(SearchTextB, stext, Pos1 + 1) + Length(SearchTextA);
Die Suche muss ab Pos1 + 1 + Length(SearchTextA) beginnen.
Delphi-Quellcode:
Pos2 := Pos(SearchTextB, stext, Pos1 + 1 + Length(SearchTextA));
Die Längenermittlung vor den Beginn der zweiten Suche muss mit in den Funktionaufruf von Pos und nicht zum Ergebnis der zweiten Pos addiert werden. Es ist letztlich ein Problem der Klammersetzung. |
AW: Problem mit Pos/PosEx
Zitat:
Leider war das nicht die Lösung. Dummy_String ändert sich trotzdem nicht. Ich geh erstmal ins Bett. :( LG Mathias |
AW: Problem mit Pos/PosEx
Hatte mir Deinen Code nicht angeschaut, nur gelesen was das Ziel war.
Mein code funktioniert bei mir mit Deiner Vorgabe. Wenn sich die Vorgabe geändert hat, muss der Code auch geändert werden. Wo liegt das problem nochmal? Bin vielleicht nur zu müde und hab die entscheiden Stelle überlesen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:51 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 by Thomas Breitkreuz