我正在使用sqlite的全文搜索支持来存储可能包含&
,<
和>
个字符的文档。我打算使用代码段功能来突出显示html结果页面的匹配项,但在注入标记之前,我没有看到明显的方法来转义文本。我宁愿在存储之前不要转义文本,因为amp
,lt
和gt
将成为令牌。
我能想到的最简单的解决方法是在存储页面之前转义页面,并使用首先取消&
,<
和>
的自定义标记器。
但是......因为snippet(foo)
的默认设置是使用<b>
和</b>
,所以看起来这是一个非常常见的用例,我确信必须是一种处理这个问题的方法而不用重新发明C轮。我是否会忽略更优雅的解决方案?
答案 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的文本;或