2010-04-12 42 views
0

我在SQL Server 2005中有一個包含數百行HTML內容的表。部分內容具有HTML:如何在SQL Server中替換正則表達式HTML標記?

<span class=heading-2>Directions</span> 

其中「路線」根據網頁名稱而變化。

我需要將所有<span class=heading-2></span>標籤更改爲<h2></h2>標籤。

我寫了這個查詢做過去內容的變化,但它並不適用於我目前的問題,因爲結束HTML標籤的工作:

Update ContentManager 
Set ContentManager.Content = replace(Cast(ContentManager.Content AS NVARCHAR(Max)), 'old text', 'new text') 

有誰知道我能做到的跨度h2純粹取代T-SQL?我發現的一切都表明我必須做CLR集成。謝謝!

+1

這可能是因爲純粹的T-SQL沒有對正則表達式的任何支持和普遍薄弱在字符串操作方面......這就是爲什麼有SQL-CLR! – 2010-04-12 16:40:17

+0

Whew,請不要使用TSQL進行此操作:) – jvenema 2010-04-12 19:17:37

+0

@timmerk - 只需確認一下,這是一次性更新的特定模式的標籤,只有極少或沒有例外情況?如果有人錯過了,它會成爲世界的終點,還是僅僅是進入並手動糾正的工作? – Thomas 2010-04-12 20:03:30

回答

1

只包括jquery-1.4.2.js事實上,T-SQL本身不支持正則表達式,這是正則表達式成爲選擇工具的問題。首先,我會說解決方案中的複雜程度很大程度上取決於數據的一致性。例如,假設我們搜索項目,標題:

Select .. 
From ... 
Where HtmlContent Like '<span class="heading-2">%' 

這是假設結束括號前最後一個雙引號後,沒有額外的間距spanclass之間沒有額外的間距以及。我們可以編寫'%<span%class="heading-2"%>%'來計算空格,但是也會在與任何span標記相同的內容中找到標記爲heading-2div標記。如果後面的情況不應該發生,但您可能有不同的空間,則使用此修訂後的模式。我們真正遇到麻煩的地方是結束標籤。假設我們的內容看起來像這樣:

<span class="heading-2"> Foo <span class="heading-3">Bar</span> And Gamma Too</span> .... <span class="heading-4">Fubar Is the right way!</span>... 

它不是那麼簡單,找到正確的收盤span標籤更改爲</h2>。您不能簡單地找到第一個</span>並將其更改爲</h2>。如果你知道你有沒有嵌套span標籤,那麼你可以寫一個用戶定義函數,將做到這一點:

Create Function ReplaceSpanToH2(@HtmlContent nvarchar(max)) 
Returns nvarchar(max) 
As 
Begin 
    Declare @StartPos int 
    Declare @EndBracket int 

    Set @StartPos = CharIndex('<span class="heading-2">', @HtmlContent) 
    If @StartPos = 0 
     Return @HtmlContent 

    Set @HtmlContent = Replace(@HtmlContent, '<span class="heading-2">', '<h2>') 

    -- find next </span> 
    Set @StartPos = CharIndex('</span>', @HtmlContent, @StartPos) 

    Set @HtmlContent = Stuff(@HtmlContent, @StartPos, 7, '</h2>') 
    Return @HtmlContent 
End 
+2

請考慮修改「這是正則表達式將成爲首選工具的問題。正則表達式不適合解析HTML或XML。一個DOM解析器(比如Html Agility Pack)是一個更好的選擇。再說一遍,T-SQL不支持這一點。 – TrueWill 2010-04-12 17:18:29

+0

@TrueWill - 對於一個簡單的替換例如被請求,其中是解析一些Html/XML,正則表達式是比T-SQL更適合的工具。對於廣泛的或深入的Html解析,類似Agility Pack的更合適。然而,如果你想要做的只是在一個文本塊中找到一個標籤,Html解析器可能是矯枉過正的。 – Thomas 2010-04-12 18:58:18

+2

這種方式就是瘋狂。 http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html – TrueWill 2010-04-12 19:13:52

-3

嘎,使用jquery!不要讓生活困難..有jQuery的網頁上的一些樣本替換代碼,你可以在<head>

0

我不是在SQL Server中真正的強者,但這裏是我怎麼會嘗試這樣做:

UPDATE TableName SET FieldName = REPLACE(FieldName ,'<span class=heading-2>', '<h2>') SET FieldName = REPLACE(FieldName, '</span>', '</h2>') 

有可能需要將發行2條UPDATE語句,我不知道你是否能在同一個領域的這種方式操作。 OP確實說出了所有文字的出現。如果我缺少一些東西,請直接告訴我。

當然,如果有其他<span class=heading-2></span>文本,你不想改變,這是行不通的。

1

如果你是積極的HTML的所有是(並將繼續是)有效XHTML和你使用SQL Server 2005或更高版本,您也許能列轉換爲XML數據鍵入並使用XQuery。見http://msdn.microsoft.com/en-us/library/ms345117%28SQL.90%29.aspx

(警告:我沒有嘗試這樣做)

我認爲最好的答案,雖然是邁克爾Petito的評論。我會寫一個應用程序來做到這一點,並使用Html Agility Pack。這將提供永久性的,可維護的解決方案,幾乎適用於所有情況。

(如果這是一次性的,你不關心的準確性,然後選擇你的毒藥。)

+0

你怎麼能聲稱使用正則表達式是「瘋狂」,並轉而建議將Html解析爲XML?!如果Html格式不正確,則不會解析爲XML!如果標記中有一個小問題,那麼這個工作的機率就會比單純使用標準搜索或正則表達式要低幾個數量級。對不起,但這是一個脆弱的解決方案。 – Thomas 2010-04-14 00:54:35

+0

TBH,如果你只是建議在你的評論中使用敏捷軟件包,我會收回我的惡意軟件。雖然我認爲它是過度的,但它甚至比嘗試使用XML數據類型更好。 – Thomas 2010-04-14 00:58:40

+0

@Thomas:請注意,我的答案以「**如果HTML是有效的XHTML **」開頭。 OP沒有提到HTML的起源。如果它被稱爲XHTML或格式良好的,這可能值得考慮。如果不是,它將不起作用。在後一種情況下,我會編寫一個應用程序(如Petito先生建議的)並使用Html Agility Pack。我不得不保持95%的解決方案和「暫時」快速而骯髒的代碼;我寧願不讓別人通過這個。 – TrueWill 2010-04-14 01:53:25