2012-11-22 25 views
1

我正在使用sqlite的全文搜索支持來存儲可能包含&,<>字符的文檔。我打算使用snippet函數來突出顯示html結果頁面的匹配項,但在注入標記之前我沒有看到明顯的方法來轉義文本。在存儲之前,我寧願不逃避文本,因爲amp,ltgt將成爲令牌。用sqlite的FTS snippet函數處理html轉義

我能想到的最簡單的解決方法是在存儲它們之前先將頁面轉義出來,然後使用自定義標記器,該標記器將首先使用隱藏的標記器&amp;&lt;&gt;

但是......因爲對於snippet(foo)默認是使用<b></b>,它真的好像這是一個很常見的情況,我相信,必須有處理這種不重新發明輪子的方式C.我是否忽略了更優雅的解決方案?

回答

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可選參數,指定是在文本永遠不會發生(這也許是不可能的),保​​證標記,並在轉義HTML文本時將其轉換爲<b>...;或
  • 改爲使用offsets函數並手動插入標記。
+0

謝謝!我存儲的文本是ReStructured Text(並且已經全部驗證),所以我最終使用了被docutils rst解析器拒絕的標記。不漂亮,但效果很好。 – strcat