CopyFromPosToPos -> StrUtils?

Rund um die LCL und andere Komponenten
Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

CopyFromPosToPos -> StrUtils?

Beitrag von theo »

Hallo

Bei diesem Thread ist mir aufgefallen, dass ich gar keine Standardfunktion in der LCL kenne, welche diese recht alltägliche Situation lösen kann.

Kennt ihr eine solche Funktion in der LCL? Wie heisst die?

Falls nicht, möchte ich wissen, was ihr davon hält, so eine Funktion in die StrUtils aufzunehmen.

Als Vorschlag hätte ich mal das:

Code: Alles auswählen

function CopyFromPosToPos(S: string; Start: string; Ende: string;
  var Position: integer): string; overload;
var
  A, B: integer;
begin
  Result := EmptyStr;
  if S <> EmptyStr then
  begin
    if Start = EmptyStr then A := Position
    else
      A := Pos(Start, S, Position);
    Position := -1;
    if A > 0 then
    begin
      Inc(A, Length(Start));
      if Ende = EmptyStr then
        B := Length(S)
      else
        B := Pos(Ende, S, A);
      if B > 0 then
      begin
        Result := Copy(S, A, B - A);
        Position := Succ(B);
      end;
    end;
  end;
end;      

function CopyFromPosToPos(S: string; Start: string; Ende: string): string; overload;
var
  Posi: integer = 1;
begin
  Result := CopyFromPosToPos(S, Start, Ende, Posi);
end;    
Mir scheint das simpel und allgemein genug, um in die StrUtils Einzug zu finden.

Damit lassen sich ohne Hirnakrobatik z.B. alle Links eines HTML Dokuments ausgeben:

Code: Alles auswählen

var
  Posi: integer;
  Res: string;
begin
  Posi := 1;
  repeat
    Res:=CopyFromPosToPos(Memo1.Text, 'href="', '"', Posi);
    if Posi > 0 then Memo1.Lines.add(Res);
  until Posi = -1;
end;   
etc. etc.

Was haltet ihr davon, diesen Vorschlag im Bugtracker zu machen?
Gibt es das schon oder findet ihr das Überflüssig?
Ja, ich weiss, RegEx, aber das ist Vielen nicht ganz geheuer.
Es gibt bestimmt auch andere Packages, die solche Funktionen mitbringen, aber ich finde diese Funktionalität sollte immer greifbar sein.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: CopyFromPosToPos -> StrUtils?

Beitrag von Winni »

Hi!

Das ist auf jeden Fall hiflreich, wenn man z.B. HTML parsen muss, z.B. für den Zelleninhalt:

Code: Alles auswählen

CellContents := CopyFromPosToPos(HTMLstring, '<TD>','</TD>',posi);

Schlag das mal für StrUtils vor.

Winni

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: CopyFromPosToPos -> StrUtils?

Beitrag von theo »

Winni hat geschrieben:
Mi 8. Feb 2023, 14:08
Das ist auf jeden Fall hiflreich, wenn man z.B. HTML parsen muss, z.B. für den Zelleninhalt:
Jetzt hast du mich noch auf eine Idee gebracht.
Start soll auch leer bleiben können, dann beginnt die Suche bei Position (oben geändert).
Dann geht auch so was:

Code: Alles auswählen

var
  Posi: integer;
  Res: string;
begin
  Posi := 1;
  repeat
    Res := CopyFromPosToPos(Memo1.Text, '<ul', '>', Posi);
    if Posi > 0 then
    begin
      if Res <> '' then Memo1.Lines.add('Parameter: ' + Res);
      Res := CopyFromPosToPos(Memo1.Text, '', '</ul>', Posi);
      if Posi > 0 then Memo1.Lines.add('Inhalt: ' + Res);
    end;
  until Posi = -1;
end;   
Der Unterschied ist, dass jetzt auch Tags mit Parametern erkannt werden und die Parameter ggf. auch ausgegeben werden. Z.B.

Code: Alles auswählen

<ul id="test">
    <li type="test">Probieren geht über Studieren</li>
</ul>
Aber das will natürlich keinen richtigen Parser ersetzen.
Als allgemeine, einfache Funktion um schnell was auszulesen, ist es aber ganz brauchbar.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: CopyFromPosToPos -> StrUtils?

Beitrag von Winni »

Hi Theo!

Ich hab jetzt 2 Stunden damit rumgespielt, und es ist robust und macht, was es soll.

Z.b. eine HTML Table aus lesen

Erstmal '<table' bis '</table>' holen.
Dann im loop '<tr' bis '</tr>'
Dann im zweiten loop die einzelnen Zellen mit '<td' bis '</td>'

Geht alles sehr gut ohne kompletten HTML Parser.

Grüße
Winni

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: CopyFromPosToPos -> StrUtils?

Beitrag von theo »

Winni hat geschrieben:
Mi 8. Feb 2023, 19:51
Ich hab jetzt 2 Stunden damit rumgespielt, und es ist robust und macht, was es soll.
Sehr gut! :D

Es ist ja eine recht einfache Funktion, aber sie ist sehr praktisch. Nicht nur die Tags sondern auch die Attribute kann man damit auflisten. Aber eigentlich ist sie ja überhaupt nicht HTML-spezifisch.

Deshalb war/bin ich mir nicht sicher, ob es so etwas in der LCL nicht schon gibt.

Vielleicht weiss jemand noch was?

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: CopyFromPosToPos -> StrUtils?

Beitrag von Winni »

Hi!


Also in StrUtils definitv nicht.
Das ist alles viel zu akademisch und für die Praxis kaum brauchbar.

Und so etwas wie containsStr ist doch nix anderes als pos(s1,s2) > 0
Dafür braucht man keine Funktion.

Nützlich in StrUtils ist lediglich PosEx, DelChars und die Definition von DigitChars und StdWordDelims

Das hatte ich mir aber in Turbo schon alles selbst zusammengeschnitzt.
Und PosEx wesentlich einfacher:
Alles vor dem Index löschen und dann mit pos arbeiten.

Winni

Benutzeravatar
KodeZwerg
Beiträge: 94
Registriert: Mo 6. Feb 2023, 11:04

Re: CopyFromPosToPos -> StrUtils?

Beitrag von KodeZwerg »

Ich würde so etwas allerdings anders benennen.
CopyFromPosToPos -> CopyWithinPosToPos, weil das ist es was es macht :mrgreen:
Zuletzt geändert von KodeZwerg am Sa 39. Okt 6043, 29:87, insgesamt 43-mal geändert.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: CopyFromPosToPos -> StrUtils?

Beitrag von Winni »

Mein Vorschlag:

CopyFromTo ()


Winni

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: CopyFromPosToPos -> StrUtils?

Beitrag von theo »

Der Name ist mir nicht so wichtig.
Ich frage mich eher, ob es zum FPC oder zu Lazarus gehören sollte.
StrUtils gehört zur FPC-RTL.
In den LazUtils gibt es auch noch einen Haufen Zeug, z.B. LazStringUtils.
Die Hürden wären vllt. bei Lazarus etwas niedriger.
In StrUtils steht oben: "Delphi/Kylix compatibility unit: String handling routines. "

Man weiss es nicht. :wink:

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: CopyFromPosToPos -> StrUtils?

Beitrag von Winni »

Hi!

In LazStrUtils gibt es etwas seht ähnliches zu CopyFromPosToPos:

Code: Alles auswählen

function GetPart(const ASkipTo, AnEnd: String; var ASource: String;
  const AnIgnoreCase: Boolean = False; const AnUpdateSource: Boolean = True): String; overload;
Grüße
Winni

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: CopyFromPosToPos -> StrUtils?

Beitrag von theo »

Ich hatte das gesehen, aber nicht ausprobiert.
Ich hatte nicht den Eindruck, dass das eine allgemein nützliche Funktion ist.
Die Doku legt nahe, dass es eine interne Sache für den Debugger ist:
"GetPart is an overloaded String function. It is used to implement facilities in the debugger."

K.A..

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: CopyFromPosToPos -> StrUtils?

Beitrag von theo »

Winni hat geschrieben:
Mi 8. Feb 2023, 23:42
In LazStrUtils gibt es etwas seht ähnliches zu CopyFromPosToPos:
Ich habe das mal ausprobiert.
Stimmt, das ist im Ergebnis sehr ähnlich, wenn auch anders gelöst.
Wieder was gelernt!
Dann hat sich das mMn erledigt.

Schade nur, dass man so etwas kaum findet.

relocate
Beiträge: 61
Registriert: Di 24. Jan 2012, 11:47
OS, Lazarus, FPC: Win (L- FPC 2.4.4 + 2.6.4)
CPU-Target: 32Bit

Re: CopyFromPosToPos -> StrUtils?

Beitrag von relocate »

Da ich nur Freepascal nutze (in der Regel nur Kommandlinetools, ansonsten Winapi) fände ich es gut, wenn derartige Funktionen mal in die RTL kommen, statt nur unter Lazarus zu Verfügung zu stehen, denn die Funktionen sind eigentlich unabhängig von einer GUI.
Würde ich die Dinge so wie alle anderen machen, hätte ich so manche Probleme nicht.

Aber das wäre langweilig.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: CopyFromPosToPos -> StrUtils?

Beitrag von theo »

relocate hat geschrieben:
Do 9. Feb 2023, 14:43
Da ich nur Freepascal nutze (in der Regel nur Kommandlinetools, ansonsten Winapi) fände ich es gut, wenn derartige Funktionen mal in die RTL kommen, statt nur unter Lazarus zu Verfügung zu stehen, denn die Funktionen sind eigentlich unabhängig von einer GUI.
Wenn du das Package "Lazutils" in die Projektanforderungen aufnimmst, kannst du diese Tools auch ohne GUI nutzen.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6208
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: CopyFromPosToPos -> StrUtils?

Beitrag von af0815 »

theo hat geschrieben:
Do 9. Feb 2023, 14:57
relocate hat geschrieben:
Do 9. Feb 2023, 14:43
Da ich nur Freepascal nutze (in der Regel nur Kommandlinetools, ansonsten Winapi) fände ich es gut, wenn derartige Funktionen mal in die RTL kommen, statt nur unter Lazarus zu Verfügung zu stehen, denn die Funktionen sind eigentlich unabhängig von einer GUI.
Wenn du das Package "Lazutils" in die Projektanforderungen aufnimmst, kannst du diese Tools auch ohne GUI nutzen.
Na ja, aber auch nur dann, wenn man die Lazarus Sourcen hat oder Lazarus verwendet. Nicht für die HardCore fpc Guys.

Sinnvoll wäre es schon, sobald der fpc auch mit UTF8 klarkommt, weil da war ja - glaube ich - Lazarus schon weiter vorne (Korregiert mich bitte falls ich das was falscher Glaube)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten