如何将HTML数据保存到Sql Server中

7

我有一个反馈面板,用户可以使用AJAX HTMLEditor编写HTML格式的反馈。

我希望将这些HTML数据保存在SQL Server中。

HTML源代码

This is <span style="font-weight: bold; ">nice</span> question

HTML输出

This is nice question

现在,如果您要查找“is nice”,但我的查询结果包含HTML标签,则该怎么办呢?

那么,在使用SQL查询和ASP.net保存和检索HTML数据时,有哪些最佳实践呢?

4个回答

5

上述链接提供了不同的选项,每个选项都有其优点和缺点,那么什么是最好的最终方法呢? - SOF User
1
@SOF:这是一个公正的问题。恐怕您需要在特定情况下权衡利弊,以决定是否采用此实现方案。我认为这是合理的。LIKE子句非常有限,正如您的问题所生动展示的那样。精心实施的全文索引可能不是完美的,但它可以扩展简单索引和查询所能达到的边界。 - kbrimington
答案中提到的链接已更新,我认为仍然相关:http://developmentnow.com/2006/08/12/sql-server-2005-full-text-search-on-html-documents/ - Guile

2

如果您正在使用 SQL Server 2008,那么全文索引是一个不错的选择。将您的 HTML 存储在 varbinary(max) 列中,并在文件类型列中将其关联的文件类型设置为“.html”。全文索引器将解析数据作为 HTML,并仅搜索文本内容,同时忽略 HTML 标记。


不错.. 但是GoDaddy提供给我们的是SQL SERVER 2005。 - SOF User
@SOF用户:全文索引功能在SQL Server 2000和SQL Server 2005中均可使用。 - gbn
不确定 SQL Server 2005 是否具有用于全文索引的 HTML 过滤器,可能只是 2008 版本的功能。 - Chris Fulstow

0

另一个答案是使用CTE在进行搜索之前剥离HTML。

以下CTE提取可能满足搜索条件的行,并递归地剥离HTML。然后,查询使用CTE的结果来过滤仍包含HTML和不完全匹配搜索条件的行。

CTE并不像看起来那么复杂。大部分的调整是为了应对PATINDEX返回0的情况。

--** Test table
DECLARE @HTML TABLE (id INT IDENTITY, html VARCHAR(max))
INSERT INTO @HTML SELECT 'This is a <span style="font-weight: bold; ">nice</span> question';
INSERT INTO @HTML SELECT 'The cat sat <span style="font-weight: bold; ">on the</span> mat';

--** Search criteria
DECLARE @Search VARCHAR(50) = 'is a nice';

--** CTE to return the matching rows ignoring the HTML
;WITH Search_CTE (html_id, html_text)
AS (
    SELECT h.id AS 'html_id'
         , LEFT(h.html,REPLACE(PATINDEX('%<%',h.html)-1,-1,999999)) + SUBSTRING(h.html,CONVERT(INT,REPLACE(PATINDEX('%>%',h.html)+1,1,999999)),LEN(h.html)) AS 'html_text'
      FROM @HTML AS h
     WHERE h.html LIKE '%' + REPLACE(@Search,' ','%') + '%'
     UNION ALL
    SELECT c.html_id AS 'html_id'
         , LEFT(c.html_text,REPLACE(PATINDEX('%<%',c.html_text)-1,-1,999999)) + SUBSTRING(c.html_text,CONVERT(INT,REPLACE(PATINDEX('%>%',c.html_text)+1,1,999999)),LEN(c.html_text)) AS 'html_text'
      FROM Search_CTE AS c
     WHERE PATINDEX('%<%',c.html_text) > 0
)
SELECT h.html AS 'Original HTML'
     , cte.html_text AS 'HTML Text'
  FROM Search_CTE AS cte
  JOIN @HTML AS h
    ON h.id = cte.html_id
 WHERE PATINDEX('%<%',cte.html_text) = 0   --** Filter out rows still containing HTML
   AND html_text LIKE '%' + @Search + '%'; --** Filter out rows not matching the search criteria

这个查询有一个限制,它不能处理文本中包含 > 或 < 的情况,但如果需要的话,可以编写代码来解决这个问题。


0

将数据存储两次,分别存储为HTML和纯文本。从HTML列中进行显示,并对文本列执行任何搜索。


这是一个有趣的答案,但这已经是我的最后选择了 :) 我不想重复数据。 - SOF User

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接