【问题标题】:SQL Server change font in html stringSQL Server更改html字符串中的字体
【发布时间】:2011-06-16 18:49:39
【问题描述】:

我的数据库中存储了一个字符串,格式为 html,用户可以更改字体大小。没关系,但我需要做一个报告,并且字体大小都需要相同。因此,如果我有以下 html,我想将其修改为字体大小为 10:

<HTML><BODY><DIV STYLE="text-align:Left;font-family:Tahoma;font-style:normal;font-weight:normal;font-size:11;color:#000000;"><DIV><DIV><P><SPAN>This is my text to display.</SPAN></P></DIV></DIV></DIV></BODY></HTML>

我有一个用户定义的函数,但显然我不能在 REPLACE 中使用通配符,所以它实际上并没有做任何事情:

ALTER FUNCTION [dbo].[udf_SetFont]
(@HTMLText VARCHAR(MAX))
RETURNS VARCHAR(MAX)
AS
BEGIN
RETURN REPLACE (@HTMLText, 'font-size:%;', 'font-size:10;')
END

(当然,如果我将字体大小作为参数发送会更好,因此我可以将其更改为任何值。)

如何修改它以更改任何字符串,使字体大小为 10?

【问题讨论】:

  • 您是否考虑过使用 CSS 类并将演示文稿格式保存在外部 CSS 文件中?
  • 这里的任何解决方案都会遇到困难,因为 T-SQL 不擅长字符串解析。我的建议是编写一个 CLR 函数,以便您可以利用 .NET 字符串库。我会发布到目前为止我想出的东西,诚然,这并不多。
  • 报告是在 Crystal Reports 中完成的,他们主要需要 html 格式。我无法控制数据的存储方式。
  • 我添加了代码作为似乎可行的答案,但在获得一些代码审查之前我不想接受我自己的答案。不知道有没有什么问题是我还没遇到过的。

标签: html sql-server sql-server-2008 user-defined-functions


【解决方案1】:

这似乎可行,尽管我只在一个字符串上尝试过(在 2 个地方设置了字体)。我从剥离所有 html 的代码开始,并将其修改为仅查找和更改“字体大小:*”。我怀疑如果字体大小为 9 或更小(1 个字符)并且我将其更改为 10(2 个字符)会出现问题,但它似乎也适用。

ALTER FUNCTION [dbo].[udf_ChangeFont]
(@HTMLText VARCHAR(MAX), @FontSize VARCHAR(2))
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @Start INT
DECLARE @End INT
DECLARE @Length INT
SET @Start = CHARINDEX('font-size:',@HTMLText)
SET @End = CHARINDEX(';',@HTMLText,CHARINDEX('font-size:',@HTMLText))
SET @Length = (@End - @Start) + 1

WHILE @Start > 0
AND @End > 0
AND @Length > 0
BEGIN
SET @HTMLText = STUFF(@HTMLText,@Start,@Length,'font-size:' + @FontSize + ';')
SET @Start = CHARINDEX('font-size:',@HTMLText, @End+2)
SET @End = CHARINDEX(';',@HTMLText,CHARINDEX('font-size:',@HTMLText, @End+2))
SET @Length = (@End - @Start) + 1
END
RETURN LTRIM(RTRIM(@HTMLText))
END

【讨论】:

    【解决方案2】:
    DECLARE @HTML NVarChar(2000) = '
      <HTML>
        <BODY>
          <DIV STYLE="text-align:Left;font-family:Tahoma;font-style:normal;font-weight:normal;font-size:11;color:#000000;">
          <DIV>
          <DIV>
            <P><SPAN>This is my text to display.</SPAN></P>
          </DIV>
          </DIV>
          </DIV>
        </BODY>
      </HTML>';
    DECLARE @X XML = @HTML;
    
    WITH T AS (
      SELECT C.value('.', 'VarChar(1000)') StyleAttribute
      FROM @X.nodes('//@STYLE') D(C)
    )
    SELECT *
    FROM T
    WHERE T.StyleAttribute LIKE '%font-size:%';
    

    从这里我将使用 CLR 函数来拆分 ; 上的 StyleAttribute 列。然后寻找以font-size: 开头的片段并在: 上再次拆分。 TryParse 该结果的第二个元素,如果不是 10,则替换它。然后,您将构建您的字符串以获得StyleAttribute 应该具有的值。从那里您可以执行 REPLACE 查找原始值(来自上表)并替换 CLR 函数的输出。

    棘手的问题...祝你好运。

    【讨论】:

      【解决方案3】:

      正如 Yuck 所说,SQL Server 字符串函数非常有限。您最终会遇到一堵墙,您最好的选择是求助于非 SQL 解决方案。

      如果您目前确实需要存储带有嵌入样式的 HTML,但也可以灵活地修改您的数据模型,您可能需要考虑在表中添加第二个数据库列。第二列将存储 HTML 的无样式版本。您可以在应用程序层解析出样式。这将使查看未来报告和其他场景中的内容变得更加容易。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-26
        相关资源
        最近更新 更多