AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Pos/PosEx

Ein Thema von NoGAD · begonnen am 11. Apr 2021 · letzter Beitrag vom 12. Apr 2021
Antwort Antwort
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#1

AW: Problem mit Pos/PosEx

  Alt 11. Apr 2021, 22:42
Ungefähr sowas? (nur hingedaddelt ala Delphi 7)
Delphi-Quellcode:
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;
Sollte aus einem gegebenen Text auch andere Fragmente entfernen können.
  Mit Zitat antworten Zitat
Benutzerbild von NoGAD
NoGAD

Registriert seit: 31. Jan 2006
Ort: Weimar
345 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Problem mit Pos/PosEx

  Alt 11. Apr 2021, 23:05
Vielen Dank euch beiden!


Dennoch verstehe und erkenne ich leider meinen Fehler nicht.


LG Mathias
Mathias
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#3

AW: Problem mit Pos/PosEx

  Alt 11. Apr 2021, 23:17
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
  Mit Zitat antworten Zitat
Benutzerbild von NoGAD
NoGAD

Registriert seit: 31. Jan 2006
Ort: Weimar
345 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Problem mit Pos/PosEx

  Alt 11. Apr 2021, 23:48
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
Es klappt einfach nicht.


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:

https://de.wikipedia.org/w/index.php...edit&section=1

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;
Mathias
  Mit Zitat antworten Zitat
Benutzerbild von NoGAD
NoGAD

Registriert seit: 31. Jan 2006
Ort: Weimar
345 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Problem mit Pos/PosEx

  Alt 11. Apr 2021, 23:58
Hier mal ein Screenshot vom Debugger.
Angehängte Grafiken
Dateityp: png Screenshot 2021-04-12 005728.png (57,7 KB, 14x aufgerufen)
Mathias
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#6

AW: Problem mit Pos/PosEx

  Alt 12. Apr 2021, 00:07
Mir scheint, dass diese Zeile falsch ist.
    Pos2 := Pos(SearchTextB, stext, Pos1 + 1) + Length(SearchTextA);

Die Suche muss ab Pos1 + 1 + Length(SearchTextA) beginnen.
    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.
  Mit Zitat antworten Zitat
Benutzerbild von NoGAD
NoGAD

Registriert seit: 31. Jan 2006
Ort: Weimar
345 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Problem mit Pos/PosEx

  Alt 12. Apr 2021, 00:10
Es ist letztlich ein Problem der Klammersetzung.

Leider war das nicht die Lösung. Dummy_String ändert sich trotzdem nicht.

Ich geh erstmal ins Bett.

LG Mathias
Mathias
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Problem mit Pos/PosEx

  Alt 12. Apr 2021, 00:25
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.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.360 Beiträge
 
Delphi 12 Athens
 
#9

AW: Problem mit Pos/PosEx

  Alt 12. Apr 2021, 08:35
Mir scheint, dass diese Zeile falsch ist.
    Pos2 := Pos(SearchTextB, stext, Pos1 + 1) + Length(SearchTextA);

Die Suche muss ab Pos1 + 1 + Length(SearchTextA) beginnen.
    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.
Um das genauer zu erklären,
mit Pos1+1 findet das zweite Pos/PosEx natürlich das " im ersten Suchstring,
darum muß die zweite Suche
auch hinter dem ersten Suchstring begonnen werden.

Wenn der zweite Suchstring nicht im Ersten vorkäme, ware es egal. (man könnte die zweite Suche also an der selben Position beginnen, wie die Erste, auch wenn es sinnlos wäre, aber zumindestens paar Byte Code sparen täte)
z.B. nach '"|' suchen
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (12. Apr 2021 um 09:06 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von NoGAD
NoGAD

Registriert seit: 31. Jan 2006
Ort: Weimar
345 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Problem mit Pos/PosEx

  Alt 12. Apr 2021, 10:12
Vielen Dank an euch alle!


Die Erklärungen sind (augenscheinlich) ja richtig. Weiterhin verstehe ich dennoch nicht, was der Fehler an meinem Gedankengang war:

Delphi-Quellcode:
var
  stext: string;
  SearchTextA, SearchTextB: String;
  Dummy_String: String;
  Pos1, Pos2: Integer;
begin
  stext := '|-' +
    '| [[A1 Verlag]] || München || 1990 ||2017, Tätigkeit eingestellt' +
    '| Belletristik, Sachbuch' +
    '|-' +
    '| [[Abenteuer Medien Verlag]] || Hamburg || 1993 || || Phantastik, Fantasyspiele' +
    '|-' +
    '| [[Acabus Verlag|ACABUS Verlag]] || [[Hamburg]] || 2008 ||data-sort-value="Diplomica"| [[Diplomica Verlag|Verlagsgruppe Diplomica]] || Belletristik, Sachbuch' +
    '|-' +
    '| [[Achterbahn (Verlag)|Achterbahn]] || [[Kiel]] || 1991 || 2003 Lappan Verlag, Oldenburg (nach Insolvenz) || Comics' +
    '|-';

  SearchTextA := 'data-sort-value="';
  SearchTextB := '"|';

  Pos1 := Pos(SearchTextA, stext, 1);
  Pos2 := Pos(SearchTextB, stext, Pos1 + 1 + Length(SearchTextA)) + Length(SearchTextB);

  Dummy_String := Copy(stext, Pos1, Pos2);
  showmessage(Dummy_String);
In diesem Beispiel sollte doch Dummy_String die Zeichenkette data-sort-value="Diplomica"| beeinhalten.

Aber probiert es selbst aus.


Ich versuche den Fehler zu finden. Oder muss ich meine Logik anpassen?

LG Mathias
Mathias
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:57 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