我有一个大字符串...原文如下:
'Lorem ipsum dolor sit amet, consectetur adipiscing <a href="hxxp://www.youtube.com/watch?v=VIDEO_1">hxxp://www.youtube.com/watch?v=VIDEO_1</a>
Sed lacinia purus turpis. Curabitur in nisi urna, vitae aliquet
Vestibulum ante ipsum primis in faucibus orci luctus hxxp://www.youtube.com/watch?v=VIDEO_2</a>'
如果您发现有视频(VIDEO_2)关闭&lt; / A&GT;没有打开&lt;一个&GT; 那些有问题的视频可以是原始文本中的任何地方和任何数字。
我想删除那些不必要的&lt; / A&GT; 如何检测和删除这些?
我在使用Delphi XE4。 有什么帮助吗?
答案 0 :(得分:2)
我相信以下代码可以高效运行:
function RemoveLonelyClosingATags(const S: string): string;
var
level: integer;
i: Integer;
ActualLength: integer;
begin
level := 0;
SetLength(result, Length(S));
ActualLength := 0;
i := 1;
while i <= Length(S) do
begin
if (S[i] = '<') and (UpperCase(Copy(S, i, 4)) = '</A>') then
begin
if Level = 0 then
begin
inc(i, 4);
Continue;
end
else
dec(Level);
end;
inc(ActualLength);
result[ActualLength] := S[i];
if (S[i] = '<') and (i < Length(S)) and (UpperCase(S[i+1]) = 'A') then
begin
inc(Level);
if Level > 1 then
raise Exception.Create('Nested A tags detected.');
end;
inc(i);
end;
SetLength(result, ActualLength);
end;
答案 1 :(得分:0)
一般功能:
Function TagStripper(inString: String; beginTag : String; endTag: String): String;
Var
index : Integer;
startTag : Integer;
closeTag : Integer;
Begin
index := 1;
While (index > 0) Do
Begin
closeTag := PosEx(endTag, inString, index);
startTag := PosEx(beginTag, inString, index);
If startTag = 0 Then
startTag := closeTag;
index := closeTag;
If (closeTag <= startTag) And (index > 0) Then
Delete(instring, closeTag, Length(endTag))
Else
If closeTag > 0 Then
index := index + Length(endTag);
End;
Result := inString;
End;
基本上它会查找开始和结束标记。如果结束标记在开始标记之前,则删除它。搜索(索引)的起始点然后从找到结束标记的任何地方重新定位。你的例子中的beginTag和endTag将是
'<a' and '</a>'.
运行时的结果是:
Lorem ipsum dolor sit amet, consectetur adipiscing <a
href="hxxp://www.youtube.com/watch?v=VIDEO_1">hxxp://www.youtube.com/watch?v=VIDEO_1</a>
Sed lacinia purus turpis. Curabitur in nisi urna, vitae aliquet
Vestibulum ante ipsum primis in faucibus orci luctus
hxxp://www.youtube.com/watch?v=VIDEO_2