SQL Server изменить шрифт в HTML-строке - PullRequest
1 голос
/ 16 июня 2011

В моей базе данных хранятся строки в формате 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?

Ответы [ 3 ]

1 голос
/ 17 июня 2011

Это похоже на работу, хотя я пробовал только на одной строке (шрифт которой установлен в 2 местах).Я начал с кода, который удаляет ВСЕ html и изменил его так, чтобы он только искал и изменял «font-size: *».Я подозревал, что могут возникнуть проблемы, если размер шрифта составляет 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
0 голосов
/ 16 июня 2011

Как сказал Юк, строковые функции SQL Server довольно ограничены. В конечном итоге вы натолкнетесь на стену, где лучше всего прибегнуть к решениям, отличным от SQL.

Если вам абсолютно необходимо хранить HTML со встроенными стилями, которые у вас есть в настоящее время, но у вас также есть возможность пересмотреть свою модель данных, вы можете рассмотреть возможность добавления второго столбца базы данных в вашу таблицу. Во втором столбце будет храниться версия HTML без стиля. Вы можете разобрать стиль на уровне приложения. Это значительно облегчит просмотр содержимого в будущих отчетах и ​​других сценариях.

0 голосов
/ 16 июня 2011
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.

Непростая проблема ... удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...