2012-11-22 2 views
1

&, <> 문자를 포함 할 수있는 문서를 저장하기 위해 sqlite의 전체 텍스트 검색 지원을 사용하고 있습니다. 스 니펫 함수를 사용하여 html 결과 페이지의 일치 항목을 강조 표시하려고했지만 마커를 삽입하기 전에 텍스트를 이스케이프 처리하는 확실한 방법은 없습니다. 차라리 amp, ltgt이 토큰이되기 때문에 텍스트를 저장하기 전에 이스케이프하지 않는 것이 좋습니다.sqlite의 FTS 스 니펫 함수로 html 이스케이프 처리

내가 생각할 수있는 가장 간단한 해결 방법은 페이지를 저장하기 전에 이스케이프 처리하고 사용자 지정 토큰izer를 사용하여 먼저 &amp;, &lt;&gt;을 이스케이프 처리하는 것입니다. snippet(foo)의 기본이 <b></b>을 사용하는 것입니다 때문에 이것은 매우 일반적인 사용 사례이며, 나는에 바퀴를 개혁하지 않고이 문제를 해결할 수있는 방법이 있어야한다는 확신처럼

그러나 ..., 정말 보인다 C. 나는 더 우아한 해결책을 간과하고 있는가?

답변

1

그합니다 (<p>이 처단되는 방식 주) 텍스트 마크 업을 처리하지 않습니다 실제로 FTS 나타납니다 텍스트를 저장하는

> 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 파서가 거부하는 마커를 사용했습니다. 예쁘지는 않지만 잘 작동합니다. – strcat