从 SQL Server 中的字符串替换 CSS 标记
Posted
技术标签:
【中文标题】从 SQL Server 中的字符串替换 CSS 标记【英文标题】:Replace CSS tags from string in SQL Server 【发布时间】:2019-07-04 05:55:00 【问题描述】:我需要更换
<span style="text-decoration: underline;">
作为
和</span>
到</u></span>
仅将</span>
替换为<span style="text-decoration: underline;">
无需将</span>
替换为<span style="color: #9bbb59;">
declare @text varchar(max)
set @text = 'i want to how tags are
<span style="color: #9bbb59;">
<span style="text-decoration: underline;">working</span>
</span>'
预期结果:
I want to how tags are
<span style="color: #9bbb59;">
<span style="text-decoration: underline;">
<u>working</u>
</span>
</span>
【问题讨论】:
我需要将 替换为 和 替换为 。无需全部替换。只需要替换下划线即可。 【参考方案1】:您可以使用 XML 函数:
DECLARE @text VARCHAR(MAX)
SET @text = 'i want to how tags are
<span style="color: #9bbb59;">
<span style="text-decoration: underline;">working</span>
<span style="text-decoration: underline;"><i>here</i></span>
<span style="text-decoration: underline;">now</span>
</span>';
-- Convert to XML
DECLARE @xml xml = CONVERT(XML, @text);
-- Get the count of nodes to be updated
DECLARE @nodeCount INT = @xml.value('count(//span[@style="text-decoration: underline;"])', 'int');
DECLARE @i INT = 1;
DECLARE @nodeValue XML;
DECLARE @newValue XML;
-- Iterate thru on the nodes
WHILE (@i <= @nodeCount) BEGIN
-- Get the original node value
SET @nodeValue = @xml.query('(//span[@style="text-decoration: underline;"][sql:variable("@i")])/*')
SET @nodeValue = IIF(CONVERT(NVARCHAR(MAX), @nodeValue) = N'', @xml.query('(//span[@style="text-decoration: underline;"][sql:variable("@i")])/text()'), @nodeValue)
-- Create the new node value
SET @newValue = N'<u></u>';
SET @newValue.modify('
insert sql:variable("@nodeValue")
into (//u)[1]
');
-- Remove child nodes
SET @xml.modify('
delete (//span[@style="text-decoration: underline;"][sql:variable("@i")]/*)
');
-- Remove textual data
SET @xml.modify('
replace value of (//span[@style="text-decoration: underline;"][sql:variable("@i")]/text())[1]
with ""
');
-- Add the new value as child
SET @xml.modify('
insert sql:variable("@newValue")
into (//span[@style="text-decoration: underline;"])[sql:variable("@i")][1]'
);
SET @i = @i+1;
END;
SELECT @xml, CONVERT(NVARCHAR(MAX), @xml);
请注意,如果无法将原始文本转换为 XML,这将不起作用。
【讨论】:
感谢您抽出宝贵时间,上述查询出现错误:“Msg 102, Level 15, State 1, Line 24 Incorrect syntax near '='.” @B.Muthamizhselvi 您使用的是哪个版本的 SQL Server? @B.Muthamizhselvi 因为这是这段代码中第一次出现 unicode 字符串文字 (N''
),我想知道我们是否真的在谈论 Micrsoft SQL Server。可能你的标签错了。
:对不起,我使用的是旧版本 2008R2。现在它在 2017 年工作。非常感谢您抽出宝贵的时间。IIF 功能在 2008R2 中没有引入【参考方案2】:
不确定是否最好,但请尝试以下查询:
DECLARE @MainString NVARCHAR(MAX) ='i want to how tags are <span style="color: #9bbb59;">
<span style="text-decoration: underline;">I am testing for another string</span>
</span>'
DECLARE @startIndex INT, @endIndex INT
SET @startIndex = CHARINDEX('<span style="text-decoration: underline;">',@MainString,CHARINDEX('<span style="text-decoration: underline;">',@MainString)) + 42
SET @endIndex = CHARINDEX('</span>',@MainString,CHARINDEX('<span style="text-decoration: underline;">',@MainString))
DECLARE @text NVARCHAR(MAX) = (SELECT SUBSTRING(@MainString,@startIndex,@endIndex - @startIndex))
SET @MainString = (SELECT REPLACE(@MainString, '<span style="text-decoration: underline;">','<span style="text-decoration: underline;"><u>'))
SET @MainString = ( SELECT REPLACE(@MainString, '<u>' + @text + '</span>','<u>' + @text + '</u></span>'))
SELECT @MainString
哪些输出符合预期:
i want to how tags are
<span style="color: #9bbb59;">
<span style="text-decoration: underline;">
<u>I am testing for another string</u>
</span>
</span>
【讨论】:
【参考方案3】:你可以试试这个
SELECT REPLACE('i want to how tags are <span style="color: #9bbb59;"><span
style="text-decoration: underline;">working</span></span>?', '<span
style="text-decoration: underline;">working</span>', '<span style="text- decoration: underline;"><u>working</u></span>');
我希望它会起作用
【讨论】:
<u><u>
里面的动态文字呢?
我想要动态的。我只给了样品。我想处理表格数据。以上是关于从 SQL Server 中的字符串替换 CSS 标记的主要内容,如果未能解决你的问题,请参考以下文章