从 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;"> 

作为

&lt;/span&gt;&lt;/u&gt;&lt;/span&gt;

仅将&lt;/span&gt; 替换为&lt;span style="text-decoration: underline;"&gt;

无需将&lt;/span&gt; 替换为&lt;span style="color: #9bbb59;"&gt;

 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>');

我希望它会起作用

【讨论】:

&lt;u&gt;&lt;u&gt;里面的动态文字呢? 我想要动态的。我只给了样品。我想处理表格数据。

以上是关于从 SQL Server 中的字符串替换 CSS 标记的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 中替换整个表中的字符

如何替换sql server中的第n个字符

sql server2008 字符串的替换

SQL SERVER 字符串截取

sql server截取某个特定字符前的字符串

SQL Server中的小技巧(重复替换截取去空格去小数点后的位数)