我遇到了这个代码,因为我遇到了同样的问题:在两个标签之间检索文本。它有效,但它只抓住了你好的第一次出现。
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>
你想抓住前两次出现的文本吗?
答案 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。