好的......这应该是相当直接的,但我无法理解最简单的方法。
我想针对我的数据库运行查询,以查看'描述'并拉出任何 < img src =" pathtoimage.jpg" />标签,所以我可以将它们扔进一个单独的表...
我的逻辑似乎是,首先你找到img标签的起点,然后是结束标签,从头到尾取下子串...但是,我也有< p>标签,所以我可以简单地获得<的索引把它作为我的开始,因为它也会拾取p标签...... 所以我必须获得<的索引然后取一个2的子串来检查它是否是p或img或href或者其他什么,然后只有当它与img匹配时才获取子串,或者是否有一种更简单的方法让我完全失踪?
我想我应该提到的另一点是,一旦我在新表中有img标签,我也想保存没有它们的描述。
答案 0 :(得分:2)
好的......所以在整个上午思考这个问题后......我终于提出了一个有效的解决方案,所以我会分享它...
我需要的是:循环浏览我的产品描述并提取任何属于描述html的图像的方法,例如:徽标或产品图片等。并将这些放在他们自己的表中,并与产品,然后将其从描述中删除。有些产品有多个图像,有些只有一个。
解决方案:
declare @prodId int
declare getproduct cursor for select Id from Product where IsActive = 1 and Description like '%<img src%'
declare @imgString varchar(200)
declare @endPos int
declare @desc varchar(max)
declare @position int
declare @outputDesc varchar(max)
open getproduct
fetch next from getproduct into @prodId
while @@FETCH_STATUS = 0
begin
-- get product Id
select @desc = Description from Product where Id = @prodId
--gets the index of the first instance of <img
select @position = CHARINDEX('<img', @desc)
while @position < len(@desc)
begin
--this assumes that we are not at the end of the description field
if (SUBSTRING(@desc, @position, 4) = '<img')
begin
select @endPos = charIndex('>', substring(@desc, @position, 200))
select @imgString = substring(@desc, @position, @endPos)
insert into dbo.ProductImage(ProductId, ImageUrl, DisplayName, IsPrimaryImage)
select @prodId, @imgString, DisplayName, 0
from Product where Id = @prodId
and not exists (select ImageUrl from ProductImage where ProductId = @prodId and ImageUrl = @imgString)
select @outputDesc = REPLACE(@desc, @imgString, '')
select @outputDesc = Replace(@outputDesc, '</img>', '')
select @position = @endPos
end
else
begin
-- if we have reached here, there are no more instances of <img
-- set @position to end of description field to prevent continuous looping
select @position = len(@desc)
end
end
select @outputDesc
update Product
set Description = @outputDesc
where Id = @prodId
select Description from Product where Id = @prodId
fetch next from getproduct into @prodId
end
close getproduct
deallocate getproduct
它可能不是最富有魅力的方式,可能会有点整理,但它有效......