如何使用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垃圾。
就像我说的那样,我相信这对于那些知道的人来说非常容易,但我现在无法绕过它。提前感谢您的回复。
答案 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)
请参阅此示例。
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;