查找和删除字符串的模式(Delphi)

时间:2013-05-26 12:32:54

标签: delphi

我有一个大字符串...原文如下:

'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。 有什么帮助吗?

2 个答案:

答案 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