我们有一个字段,其中包含用于在网站上格式化的HTML标记,但我们只需查询应在屏幕上呈现的文本,而不是查询CSS标记,标记名称,属性名称等。
有没有办法忽略SQL查询或存储过程中的标记?如果有办法解决这个问题,我们以后会遇到性能问题吗?
我的猜测是,有一些方法可以使用尖括号来解析可搜索文本的字段。
答案 0 :(得分:4)
这样的处理不应该在数据库中完成。我建议创建一个仅包含文本内容的单独字段。
回应@Nissan粉丝评论:从HTML中提取文本不是数据库的工作IMO。它的工作太复杂了,而且变量太多了。我不太熟悉阅读存储过程,但如果我正确地阅读了代码,它将在源代码中出现(无效但仍然经常出现)未编码<
的问题。并且它很可能会因无效的HTML而中断。
或者想象有一天,客户来了,希望img
元素'ALT
属性也被索引。或者title
。使用“开始位置,结束位置”算法开始构建。你会去疯狂。
我说,如果需要在日常的基础上处理来自控制之外的各种来源的HTML,请将其留在数据库上方,以便更好地处理这些内容。基于DOM的方法 - 可能使用BeautifulSoup来处理无效的HTML - 解析所有nodeValue
将是最可靠的事情。
也许这有点过分,存储过程在OP的情况下也能正常工作 - 从他的评论中看起来就像是这样,而且完全可以。我只是说,如果你无法控制传入的HTML,请不要使用数据库为作业提供的有限手段来剥离HTML。
答案 1 :(得分:3)
以下是您可以利用的用户定义函数:
答案 2 :(得分:3)
我同意佩卡的意见;这不是您的数据库应该处理的事情。
在数据库中进行此解析的缺点:
性能问题。使用UDF会降低性能并导致表扫描。即使你避免使用表扫描,你仍然要求数据库做一些它不是设计的东西(字符串操作)。
更难做对。正确解析HTML是一项艰巨的任务。是的,你可以使用UDF获得95%的路径,但是在应用程序层中处理这个问题可能会让你100%完成任务。
难以测试。我更倾向于编写针对字符串文字在C#中执行的HTML剥离代码的单元测试,而不是必须往返于数据库。
如果必须在数据库中执行此操作...
如果需要在DB中执行此操作,请考虑以下方法:
在数据库中添加第二个字段以保存内容的纯文本版本。
添加触发器,以便每次更改HTML值时,都会重新生成文本版本。
根据纯文本字段编写查询。
您将获得更好的性能,因为您只在写入时进行解析,而不是在每次搜索时进行解析,并且您的数据库将更好地利用您在纯文本字段中定义的任何索引。
答案 3 :(得分:0)
如果您可以在查询中运行正则表达式,则可以使用以下示例删除HTML并仅返回文本:http://www.regular-expressions.info/examples.html
答案 4 :(得分:0)
如果您尝试索引其中一列并通过删除html来访问它:
WHERE dbo.anyRemoveHtml(yourColumn)='your search text'
不会使用索引,您将进行表扫描。当应用程序的数据很少时,这可能不是问题,但随着向表中添加更多数据,将导致SELECT越来越慢。
注意:dbo.anyRemoveHtml只是一个组成的名称,代表您选择删除HTML的功能,并且实际上并不存在