1

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

我能想到的最简单的解决方法是在存储页面之前对页面进行转义,并使用一个自定义标记器,该标记器首先将&amp;unescape&lt;&gt;.

但是...由于默认snippet(foo)使用<b>and </b>,这似乎是一个非常常见的用例,我相信必须有一种方法来处理这个问题,而无需在 C 中重新发明轮子。我是否忽略了更多优雅的解决方案?

4

1 回答 1

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>...当您为 HTML 转义文本时;或者
  • 请改用该offsets功能并手动插入标记。
于 2012-11-22T09:29:48.057 回答