1

&<および>文字を含む可能性のあるドキュメントを保存するために、sqlite の全文検索サポートを使用しています。スニペット機能を使用して html 結果ページの一致を強調表示するつもりでしたが、マーカーを挿入する前にテキストをエスケープする明確な方法がわかりません。amp保存する前にテキストをエスケープしたくltありませんgt

私が考えることができる最も簡単な回避策は、ページを保存する前にエスケープ&amp;し、最初にエスケープ&lt;しないカスタムトークナイザーを使用すること&gt;です.

ただし...デフォルトの forsnippet(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>>?

テキストを格納する最もクリーンな方法は、エスケープされていないプレーン テキストです。ただし、検索結果を適切に強調表示するには、次の 2 つの選択肢があります。

  • のオプション パラメータを使用して、テキスト内に絶対に出現しないことが保証さsnippetれているマーカーを指定し(これは不可能な場合があります)、 HTML のテキストをエスケープするときにそれらを変換します。また<b>...
  • offsets代わりに関数を使用し、手動でマーカーを挿入してください。
于 2012-11-22T09:29:48.057 に答える