2

我有一个大字符串......原始文本是这样的:

'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) 有一个关闭 < /a> 而没有打开 <a> 那些有问题的视频可以在原始文本中的任何位置和任何数字。

我想删除那些不必要的</a> 如何检测和删除那些?

我在德尔福 XE4 上。请问有什么帮助吗?

4

2 回答 2

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;
于 2013-05-26T12:54:44.010 回答
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
于 2013-05-27T07:44:45.923 回答