Delphi提取2个标签之间的字符串

时间:2010-08-30 20:27:26

标签: regex delphi

如何使用delphi在2个html标签之间提取文本? 这是一个示例字符串。

blah blah blah<tag>text I want to keep</tag>blah blah blah

我想提取它的这一部分。

<tag>text I want to keep</tag>

(基本上删除了我想要保留的<tag>&amp; </tag>字符串之前和之后的所有blah blah blah垃圾。

就像我说的那样,我相信这对于那些知道的人来说非常容易,但我现在无法绕过它。提前感谢您的回复。

4 个答案:

答案 0 :(得分:7)

这完全取决于输入的外观。

更新首先,我为特殊情况编写了一些解决方案,但在OP解释了更多关于细节之后,我不得不对它们进行一些概括。这是最通用的代码:

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;


function ExtractTagAndTextInsideGivenTagEx(const Tag, Text: string): string;
var
  StartPos, EndPos: integer;
begin
  result := '';
  StartPos := Pos('<' + Tag, Text);
  EndPos := Pos('</' + Tag + '>', Text);
  if (StartPos > 0) and (EndPos > StartPos) then
    result := Copy(Text, StartPos, EndPos - StartPos + length(Tag) + 3);
end;

样本用法

ExtractTextInsideGivenTagEx('tag',
    'blah <i>blah</i> <b>blah<tag a="2" b="4">text I want to keep</tag>blah blah </b>blah')

返回

text I want to keep

,而

ExtractTagAndTextInsideGivenTagEx('tag',
    'blah <i>blah</i> <b>blah<tag a="2" b="4">text I want to keep</tag>blah blah </b>blah')

返回

<tag a="2" b="4">text I want to keep</tag>

答案 1 :(得分:7)

如果你有Delphi XE,你可以使用新的RegularExpressions单位:

ResultString := TRegEx.Match(SubjectString, '(?si)<tag>.*?</tag>').Value;

如果你有旧版本的Delphi,你可以使用第三方正则表达式组件,例如TPerlRegEx

Regex := TPerlRegEx.Create(nil);
Regex.RegEx := '(?si)<tag>.*?</tag>';
Regex.Subject := SubjectString;
if Regex.Match then ResultString := Regex.MatchedExpression;

答案 2 :(得分:3)

您可以使用pos copy函数构建函数。

请参阅此示例。

Function ExtractBetweenTags(Const Value,TagI,TagF:string):string;
var
i,f : integer;
begin
 i:=Pos(TagI,Value);
 f:=Pos(TagF,Value);
 if (i>0) and (f>i) then
 Result:=Copy(Value,i+length(TagI),f-i-length(TagF)+1);
end;


Function ExtractWithTags(Const Value,TagI,TagF:string):string;
var
i,f : integer;
begin
 i:=Pos(TagI,Value);
 f:=Pos(TagF,Value);
 if (i>0) and (f>i) then
 Result:=Copy(Value,i,f-i+length(TagF));
end;

并像这样打电话

StrValue:='blah blah blah<tag> text I want to keep</tag>blah blah blah';
NewValue:=ExtractBetweenTags(StrValue,'<tag>','</tag>');//returns 'text I want to keep'
NewValue:=ExtractWithTags(StrValue,'<tag>','</tag>');//returns '<tag>text I want to keep</tag>'

答案 3 :(得分:3)

我发现这个版本更通用,因为它不仅限于标签的一次出现。它会在starttag之后搜索下一个endtag。

Function ExtractBetweenTags(Const Line, TagI, TagF: string): string;
var
  i, f : integer;
begin
  i := Pos(TagI, Line);
  f := Pos(TagF, Copy(Line, i+length(TagI), MAXINT));
  if (i > 0) and (f > 0) then
    Result:= Copy(Line, i+length(TagI), f-1);
end;