4

我有一个description列的表。该列中有一些html。

然后该 html 传递到页面,并呈现它。但有时会遇到评论,有时不关闭。我需要清理这些数据。

我已经通过

select * from table where description like '%<!--%'`  

我认为它不正确,但我不知道如何做得更好。

你能建议我的问题的解决方案吗?

编辑
这里是一些例子。

<div class="text"> some data </div>
<ul><!-- Some comment -->
  <li>test</li>
  <li>test2</li> <!-- Some comment
</ul>

问候,德米特里。

4

2 回答 2

3

试试这个——

询问:

DECLARE @temp TABLE
(
      id INT IDENTITY(1,1)
    , [description] NVARCHAR(MAX)
)

INSERT INTO @temp ([description])
VALUES ('
<div class="text"> some data <!--test</div>
<ul>
  <li>test</li>
  <li>test2</li> <!-- Some comment
</ul>')

;WITH cte AS 
(
    SELECT t.id, t.token
    FROM (
        SELECT 
              t.id
            , token = 
                SUBSTRING(
                      t.[description]
                    , number
                    , ABS(CHARINDEX('<', t.[description], number + 1) - number))
        FROM @temp t
        CROSS JOIN [master].dbo.spt_values n
        WHERE [type] = 'p'
            AND number <= LEN(t.[description]) - 1
            AND SUBSTRING(t.[description], number, 1) = '<'
    ) t
    WHERE t.token NOT LIKE '<!--%'
)
UPDATE t
SET [description] = (
    SELECT c.token
    FROM cte c
    WHERE c.id = t.id
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)')
FROM @temp t

SELECT *
FROM @temp

结果:

<div class="text"> some data </div>
<ul>
  <li>test</li>
  <li>test2</li> 
 </ul>
于 2013-06-03T11:29:47.807 回答
1

用于CASE WHEN检查是否存在打开的评论序列以及是否存在关闭的评论序列,并在必要时返回添加关闭评论的列。

SELECT * ,
  CASE WHEN CHARINDEX('<!--', description) > 0
    AND CHARINDEX('-->', description) = 0 
  THEN description + '-->'
  ELSE description
  END AS clean_description
FROM dbo.[table]

或者,如果您想删除损坏的评论,请使用

SUBSTRING(description, 0, CHARINDEX('<!--', description))

THEN语句的分支。

于 2013-06-03T11:11:49.413 回答