ГлавнаяРабота с текстом и строками → Функция, возвращающая текст между двумя определёнными строками

Создано: 02.08.2010 18:50:27 · Исправлено: 02.08.2010 18:50:41 · Прочтений: 154


procedure IsolateText( const S: string; Tag1, Tag2: string; list:TStrings );
  var
    pScan, pEnd, pTag1, pTag2: PChar;
    foundText: string;
    searchtext: string;
  begin
    { Set up pointers we need for the search. HTML is not case sensitive, so
      we need to perform the search on a uppercased copy of S.}

    searchtext := Uppercase(S);
    Tag1:= Uppercase( Tag1 );
    Tag2:= Uppercase( Tag2 );
    pTag1:= PChar(Tag1);
    pTag2:= PChar(Tag2);
    pScan:= PChar(searchtext);
    Repeat
      { Search for next occurence of Tag1. }
      pScan:= StrPos( pScan, pTag1 );
      if pScan <> nil Then begin
        { Found one, hop over it, then search from that position
          forward for the next occurence of Tag2. }

        Inc(pScan, Length( Tag1 ));
        pEnd := StrPos( pScan, pTag2 );
        if pEnd <> nil Then begin
          { Found start and end tag, isolate text between,
            add it to the list. We need to get the text from
            the original S, however, since we want the un-uppercased
            version! So we calculate the address pScan would hold if
            the search had been performed on S instead of searchtext. }

          SetString( foundText, 
                     Pchar(S) + (pScan- PChar(searchtext) ),
                     pEnd - pScan );
          list.Add( foundText );

          { Continue next search after the found end tag. }
          pScan := pEnd + Length(tag2);
        end if }
        else { Error, no end tag found for start tag, abort. }
          pScan := Nil;
      end; if }
    Until pScan = Nil;
  end;