sql从存储的html中提取所有img src标记

时间:2014-02-05 19:53:30

标签: html sql image sql-server-2008 substring

好的......这应该是相当直接的,但我无法理解最简单的方法。

我想针对我的数据库运行查询,以查看'描述'并拉出任何     < img src =" pathtoimage.jpg" />标签,所以我可以将它们扔进一个单独的表...

我的逻辑似乎是,首先你找到img标签的起点,然后是结束标签,从头到尾取下子串...但是,我也有< p>标签,所以我可以简单地获得<的索引把它作为我的开始,因为它也会拾取p标签...... 所以我必须获得<的索引然后取一个2的子串来检查它是否是p或img或href或者其他什么,然后只有当它与img匹配时才获取子串,或者是否有一种更简单的方法让我完全失踪?

我想我应该提到的另一点是,一旦我在新表中有img标签,我也想保存没有它们的描述。

1 个答案:

答案 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

它可能不是最富有魅力的方式,可能会有点整理,但它有效......