Delphi在标签之间提取两次字符串

时间:2014-10-21 10:56:16

标签: xml delphi text tags

我遇到了这个代码,因为我遇到了同样的问题:在两个标签之间检索文本。它有效,但它只抓住了你好的第一次出现。

function ExtractTextInsideGivenTagEx(const Tag, Text: string): string;
var
  StartPos1, StartPos2, EndPos: integer;
  i: Integer;
begin
  result := '';
  StartPos1 := Pos('<' + Tag, Text);
  EndPos := Pos('</' + Tag + '>', Text);
  StartPos2 := 0;
  for i := StartPos1 + length(Tag) + 1 to EndPos do
    if Text[i] = '>' then
    begin
      StartPos2 := i + 1;
      break;
    end;


  if (StartPos2 > 0) and (EndPos > StartPos2) then
    result := Copy(Text, StartPos2, EndPos - StartPos2);
end;

但如果你有什么

<sample>hello1</sample><sample>hello2</sample><sample>hello3</sample><sample>hello4</sample>

你想抓住前两次出现的文本吗?

1 个答案:

答案 0 :(得分:0)

让您的搜索功能记住StartPos并使用Pos()和可选的偏移参数。

program Project1;

{$APPTYPE CONSOLE}

function ExtractTextInsideGivenTagEx(const Tag, Text: string;
  var StartPos: Integer): string;
var
  StartPos2, EndPos: Integer;
  i: Integer;
begin
  Result := '';
  StartPos := Pos('<' + Tag, Text, StartPos); // PosEx() in older Delphi versions
  EndPos := Pos('</' + Tag + '>', Text, StartPos);
  StartPos2 := 0;
  for i := StartPos + Length(Tag) + 1 to EndPos do
  begin
    if Text[i] = '>' then
    begin
      StartPos2 := i + 1;
      break;
    end;
  end;
  if (StartPos2 > 0) and (EndPos > StartPos2) then
  begin
    Result := Copy(Text, StartPos2, EndPos - StartPos2);
    StartPos := StartPos2;
  end;
end;

procedure Test(const Sample, aString: String);
var
  s: String;
  StartPos,foundTags: Integer;
begin
  StartPos := 1;
  foundTags := 0;
  repeat
    s := ExtractTextInsideGivenTagEx(Sample, aString, StartPos);
    if (s <> '') then
    begin
      WriteLn(s);
      Inc(StartPos, Length(Sample));
      Inc(foundTags);
    end;
  until (s = '') or (foundTags = 2);
end;

begin
  Test('sample',
    '<sample>hello1</sample><sample>hello2</sample><sample>hello3</sample><sample>hello4</sample>');
  ReadLn;
end.

现在已经为示例XML文本提供了解决方案,请注意XML(和HTML)文档可能比此示例复杂得多。这意味着如果没有完整的完整解析器,很容易丢失标签的跟踪。请参阅XML parsing, TXMLDocument