Chinaunix首页 | 论坛 | 博客
  • 博客访问: 874784
  • 博文数量: 372
  • 博客积分: 10063
  • 博客等级: 中将
  • 技术积分: 4220
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-24 11:36
文章分类

全部博文(372)

文章存档

2012年(372)

分类: 虚拟化

2012-03-25 19:43:36

现在有一个小场景,数据库中某表的一个字段存储的是html代码,假如现在需要替换掉html代码中的所有标签。

我们当然可以在C#中这样做:

Regex regex = new Regex(@"]*>[^<]*
"); string cleanedHtml = regex.Replace(html, "");

可是我并不想再写个循环去遍历每条记录,然后保存每条记录,我想在数据库中一步到位,而sql只提供了简单的replace函数,这个函数明显不能达到咱的要求,那就去写一个自定义函数吧。

本文已同步至我的个人博客站点:|

函数源代码如下:

--SQL正则替换函数 CREATE function dbo.regexReplace ( @source ntext, --原字符串 @regexp varchar(1000), --正则表达式 @replace varchar(1000), --替换值 @globalReplace bit = 1, --是否是全局替换 @ignoreCase bit = 0 --是否忽略大小写 ) returnS varchar(1000) AS begin declare @hr integer declare @objRegExp integer declare @result varchar(5000) exec @hr = sp_OACreate 'VBScript.RegExp', @objRegExp OUTPUT IF @hr <> 0 begin exec @hr = sp_OADestroy @objRegExp return null end exec @hr = sp_OASetProperty @objRegExp, 'Pattern', @regexp IF @hr <> 0 begin exec @hr = sp_OADestroy @objRegExp return null end exec @hr = sp_OASetProperty @objRegExp, 'Global', @globalReplace IF @hr <> 0 begin exec @hr = sp_OADestroy @objRegExp return null end exec @hr = sp_OASetProperty @objRegExp, 'IgnoreCase', @ignoreCase IF @hr <> 0 begin exec @hr = sp_OADestroy @objRegExp return null end exec @hr = sp_OAMethod @objRegExp, 'Replace', @result OUTPUT, @source, @replace IF @hr <> 0 begin exec @hr = sp_OADestroy @objRegExp return null end exec @hr = sp_OADestroy @objRegExp IF @hr <> 0 begin return null end return @result end

需要注意的是,即使写好了这个函数,也并不能马上使用。执行这个函数时可能会出现以下的错误:

Msg 15281, Level 16, State 1, Line 1 SQL Server blocked access to procedure 'sys.sp_OACreate' of component 'Ole Automation Procedures' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'Ole Automation Procedures' by using sp_configure. For more information about enabling 'Ole Automation Procedures', see "Surface Area Configuration" in SQL Server Books Online.

这是因为未开启Ole Automation Procedures选项,。执行下面的语句开启这个选项:

sp_configure 'show advanced options', 1; GO RECONFIGURE; GO sp_configure 'Ole Automation Procedures', 1; GO RECONFIGURE; GO

所有的准备工作都已经做好,那就试验一下吧。

Example1:忽略大小写并替换select dbo.regexReplace('123456',']*>[^<]*','',1,1) Example2: 使用贪婪匹配

html代码:

<p> Also Available - <a style="text-decoration: none" href="/isbn/9780199218691"><font color="#000FF"><b>Smith & Hogan: Criminal Law Cases & Materials 10th edb>font>a> <p> There is, as ever, detailed analysis of the many recent case developments, in particular, a revision of the chapter dealing with secondary liability and joint enterprise.p> p>

调用代码:

select dbo.regexReplace(html,']*>(.|\n)*?','',1,1) Example3:去除html标签select dbo.regexReplace('

Key Contact:
Mr Jack, Zhou
General Manager

Mr Adu, Ho
Marketing Director
Overseas Sales

Ms Winny, Luo
Sales Manager
Overseas Sales

' ,'<[^>]*>','',1,0) Example4:数据库字段值替换update Books set [Description] = dbo.regexReplace([Description],']*>(.|\n)*?','',1,1)

Always keep dream, keep thinking, keep moving, even if the road obstacles , the one more important thing is that always be a pig for you, that's keep fool.

阅读(781) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~