Find en title

Tags:    delphi
Skrevet af Bruger #1 @ 16.06.2001
Find en title

Hvis du nogensinde har haft brug for at finde det der står mellem de 2 title tags i et HTML dokument, er denne artikel et godt sted at starte :-). Den kan dog senere udbygges til alt muligt andet, så hvis du er lidt grøn i det med strings, kan denne artikel være en god hjælp/inspiration. Det sidste stykke tid har jeg leget meget med strings, og jo mere jeg bruger de forskellige metoder, jo mere finder jeg ud af hvor ekstremt værdifulde de er! I dette meget lille eksempel vil jeg vise hvordan man via teksten i et SynMemo komponent (bruges i mange HTML editorer til syntax farvning, er en del af SynEdit pakken som kan hentes her), kan lede alle linierne igennem for at finde ud af hvad der står imellem de to title tags, og på den måde finde et dokuments title (den der vises øverst i browservinduet). Jeg viser lige lidt kode, og forklarer det bagefter:
var
 i :integer;
 start, stop:TPoint;
 Kode:string;
begin
for i := 0 to Editor.Lines.Count - 1 do
 begin
  Kode := Editor.Lines[i];
  If Pos('<title>', Lowercase(Kode)) > 0 then
   begin
    Start.x := Pos('<title>', Lowercase(Kode))+7;
    Start.y := i+1;
   end;
  If Pos('</title>', Lowercase(Kode)) > 0 then
   begin
    Stop.x := Pos('</title>', Lowercase(Kode));
    Stop.y := i+1;
   end;
 end;
Editor.BlockBegin := Start;
Editor.BlockEnd := Stop;
ShowMessage(Editor.SelText);
Vi starter med at deklarere nogen variabler. SynMemo (kaldet for Editor i dette eksempel), er lidt sær mht. SelStart og SelEnd, så derfor bruger vi BlockBegin og BlockEnd i stedet, der sættes via en X og en Y værdi (Y er hvilken linie i Memo'en, og X er et sted på Y), der gemmes i en TPoint (der altid indeholder en X og en Y værdi). Derfor skal vi bruge en TPoint variabel, i dette tilfælde kaldet for Start og Stop. i kender de fleste, som er den variabel de fleste ville bruge i en løkke. Kode er en string som vi bruger til at lægge hver enkel linie af Editor ned i. Nu kommer vi så til selve koden!

Vi starter med at lave en løkke, der løber alle Editor's linier igennem. Hver gang den når til en ny linie, sætter den Kode = den linie den er nået til (altså i). Når det er gjort, bruger vi en smart string funktion i Delphi, der hedder Pos. Pos gør det at den går ind i en string (i dette tilfælde Kode), og starter fra en ende af med at lede efter det man skriver først i parantesen (i dette tilfælde er det <title> vi skal finde). Den starter simpelthen ved det første bogstav i strengen kode, og kigger så efter title tagget. Finder den det ikke, går den et bogstav frem, og kigger så igen efter title, og sådan bliver den ved, indtil den har været hele strengen igennem. Pos er en funktion der returnerer et tal der indikerer om den har fundet det vi leder efter eller ej. Det er derfor jeg ser om den er større en 0, for hvis den er det, ja så har vi fundet title tagget, og har vi fundet det, så skynder vi os at sætte vores start variabel. Som jeg sagde før består den af en X og en Y værdi, og det er dem vi sætter. X bliver sat til der hvor vi har fundet title tagget plus 7 karakterer frem. Og hvorfor så det? Jo det er naturligvis fordi at vi kun vil have det der står imellem. Pos returnerer den position hvor <title> blev fundet, og derfor lægger vi 7 til (længden af et title tag). Vi sætter også lige Start.Y til at være = i+1. I er jo den linie vi er på i løkken, og så skal der lige lægges en til. Nu har vi altså en præcis position på hvor teksten mellem title tags starter, men vi skal jo også have et sted hvor den slutter! Det gør vi på præcis samme måde, bortset fra at vi leder efter </title>, som jo er slut tagget. Når det er fundet gør vi lige som før, bortset fra at vi ikke lægger 7 til start.x. De fleste kan sikkert gætte hvorfor :-).

Når løkken er færdig med at køre, sætter vi BlockBegin til at være lig med vores Start værdi, og BlockEnd til at være lig vores Stop værdi. På den måde har vi nu fået markeret teksten mellem title tags'ne, og derfor er det bare at vise Editors SelText. Det er da skide smart?!? Men lad os gøre det hele lidt smartere, ved at smide det hele ned i funktion som vi så kan bruge til at finde titlen i et dokument. Sådan en funktion kunne se således ud:
// Husk at deklarere funktionen
  ..
  public
    { Public declarations }
    function FindTitle : string;
  ..	
	
// Selve funktioen	
function TForm1.FindTitle : string;
var
 i :integer;
 start, stop:TPoint;
 Titel,Kode:string;
begin
for i := 0 to Editor.Lines.Count - 1 do
 begin
  Kode := Editor.Lines[i];
   If Pos('<title>', Lowercase(Kode)) > 0 then
   begin
    Start.x := Pos('<title>', Lowercase(Kode))+7;
    Start.y := i+1;
   end;
  If Pos('</title>', Lowercase(Kode)) > 0 then
   begin
    Stop.x := Pos('</title>', Lowercase(Kode));
    Stop.y := i+1;
   end;
 end;
Editor.BlockBegin := Start;
Editor.BlockEnd := Stop;
Result := Editor.SelText;
end;
Der er sådan set ikke de store ændringer! Den første linie viser at det er funktion, der returnerer en string værdi. Derfra kender i resten, på nær den sidste linie. Den sætter funktionens resultat til at være Editors seltext, i stedet for at vise den med en ShowMessage. Nu kan vi så fx bruge vores funktion sådan her:
procedure TForm1.Button1Click(Sender: TObject);
begin
 Edit1.Text := FindTitle;
end;
Så nemt er det! Nu kan funktionen bruges lige så mange gange det er nødvendigt! Dette her var bare en lille funktion som jeg selv har lavet for et par dage siden, og det er kun en lille del af alle de ting jeg har eksperimenteret med :-). Jeg regner med at jeg skriver lidt flere artikler, der primært er henvendt til dem der selv er i gang med en HTML editor, men som også kan bruges af andre, til andre formål. Jeg ved ikke helt hvad der kommer næste gang, men vi får se!


Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (3)

User
Bruger #4288 @ 04.09.03 14:15
Der er en fejl i koden i BlockBegin og BlockEnd kan ikke få det til at virke
User
Bruger #3353 @ 22.11.03 19:03
som altid en god artikel....
User
Bruger #2959 @ 18.01.04 14:35
HVor er den næste artikel som lovet?
Du skal være logget ind for at skrive en kommentar.
t