下面的函数应该可以完成这项工作。它只是找到目标图像名称的图像开始和结束标记,然后删除文本。
ALTER FUNCTION Html_RemoveImageAttributes
(
@sourceImage NVARCHAR(100),
@inputHtml NVARCHAR(MAX)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
DECLARE @imageTagStart INT = CHARINDEX('<img ' , @inputHtml, 1);
DECLARE @imageIndex INT = CHARINDEX(@sourceImage, @inputHtml, @imageTagStart);
DECLARE @imageTagEnd INT = CHARINDEX('/>' , @inputHtml, @imageTagStart);
DECLARE @outputHtml NVARCHAR(MAX) = @inputHtml;
WHILE (@imageIndex > 0)
BEGIN
IF (@imageIndex > @imageTagStart) AND (@imageIndex < @imageTagEnd)
BEGIN
-- Remove first occurrence of image.
SET @outputHtml = REPLACE(@outputHtml, SUBSTRING(@outputHtml, @imageTagStart, @imageTagEnd - @imageTagStart + 2), '');
SET @imageTagStart = CHARINDEX('<img ' , @outputHtml);
SET @imageIndex = CHARINDEX(@sourceImage, @outputHtml);
SET @imageTagEnd = CHARINDEX('/>' , @outputHtml);
END
ELSE
BEGIN
SET @imageTagStart = CHARINDEX('<img ' , @outputHtml, @imageTagEnd);
SET @imageIndex = CHARINDEX(@sourceImage, @outputHtml, @imageTagEnd);
SET @imageTagEnd = CHARINDEX('/>' , @outputHtml, @imageTagEnd + 1);
END
END
RETURN @outputHtml
END
下面的例子展示了如何使用它:
DECLARE @sourceImage NVARCHAR(50) = 'remove-me.png';
DECLARE @input NVARCHAR(4000) = N'<div>
<p>some text goes here <img width="100" src="/upload/remove-me.png" /></p>
<p>some other text goes here <img height="100" src=''/upload/remove-me.png'' width="200" /></p>
<p>some other text goes here <img src="/upload/filename.png" /></p>
</div>';
PRINT dbo.Html_RemoveImageAttributes(@sourceImage, @input);