2010-04-12 124 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