使用sqlite的FTS片段函数处理html转义

时间:2012-11-22 01:20:16

标签: python sqlite full-text-search fts4

我正在使用sqlite的全文搜索支持来存储可能包含&<>个字符的文档。我打算使用代码段功能来突出显示html结果页面的匹配项,但在注入标记之前,我没有看到明显的方法来转义文本。我宁愿在存储之前不要转义文本,因为ampltgt将成为令牌。

我能想到的最简单的解决方法是在存储页面之前转义页面,并使用首先取消&amp;&lt;&gt;的自定义标记器。

但是......因为snippet(foo)的默认设置是使用<b></b>,所以看起来这是一个非常常见的用例,我确信必须是一种处理这个问题的方法而不用重新发明C轮。我是否会忽略更优雅的解决方案?

1 个答案:

答案 0 :(得分:1)

看来FTS确实没有处理文本中的标记(注意<p>如何被切断):

> CREATE VIRTUAL TABLE test USING fts3(content TEXT);
> INSERT INTO test VALUES('<p>Isn''t this <font face="Comic Sans">funny</font>?');
> INSERT INTO test VALUES('blah');
> SELECT snippet(test) FROM test WHERE content MATCH 'funny';
p>Isn't this <font face="Comic Sans"><b>funny</b></font>?
> SELECT snippet(test) FROM test WHERE content MATCH 'font';
p>Isn't this <<b>font</b> face="Comic Sans">funny</<b>font</b>>?

存储文本的最简洁方法是纯文本,未转义。 但是,要正确突出显示搜索结果,您有两种选择:

  • 使用snippet的可选参数指定保证的标记永远不会出现在文本中(可能无法实现),并在<b>...转换为offsets时你正在逃避HTML的文本;或
  • 使用{{1}}功能代替并手动插入标记。