2013-05-26 27 views
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> 如何檢測並刪除那些?

我在Delphi XE4上。 請幫忙嗎?

+0

什麼是「具有封閉不開放」的視頻:在運行時,它是beginTag和ENDTAG在你的例子是

'<a' and '</a>'. 

結果? –

+0

我編輯了這個問題,現在更清楚了。 – user1493428

+0

你想在源代碼編輯器或運行時執行此操作嗎? – TLama

回答

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

它完美無缺!非常感謝你 – user1493428

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;        

本質上,它尋找一個開啓和關閉標籤。如果結束標記在開始標記之前出現,則將其刪除。搜索起點(索引)然後從發現結束標記的任何地方重新發布。

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 
+0

好,但是'Delete'在性能方面當然不是最優的。 (這就是爲什麼我使用'ActualLength'模式的原因。) –

+0

哦,我和其他人就Embarcadero關於這個主題的論壇進行了很多辯論:-)。我們只是說我認爲首先應該關注可讀性,而優化只有在觀察到性能不可接受時纔會發生。這就是說,我沒有理解你的方法如何工作。 – alcalde