2017-10-13 3 views
-1

결과에서 검색어를 강조하는 검색 기능을 프로그래밍하려고합니다. 현재이 코드 $hightlight = preg_replace('/'.strtolower($query).'/', '<span class=hightlight>'.strtolower($query).'</span>', strtolower($text));을 강조 표시하는데 사용하고 있습니다. 검색중인 텍스트는 데이터베이스의 문자열입니다. 문제는 텍스트에 일부 html 특수 문자가 포함되어 있고 예를 들어 <test>이고 사용자가 <te을 검색하면 다음 결과가 나타납니다. <span class="hightlight"><te< span="">st&gt;</te<></span>st>으로 해석됩니다. 이것은 의미가 있지만, 나는 이것을 원하지 않는다. <te가 강조 표시된 결과 <test>이 표시됩니다. 그래서 특수 문자를 벗어나야합니다. 나는 함수 htmlspecialchars이 있다는 것을 알고 있지만,이 경우 어떻게 사용할 수 있습니까? 또는 다른 기능? HTML 코드를 검색하는 것보다 검색하기 전에 이스케이프 처리 할 수 ​​없습니다. 텍스트가 <span> 태그보다 많고 HTML 코드로 변환되기 때문에 검색 후에도 이스케이프 처리 할 수 ​​없습니다. 내 문제를 이해하길 바래. 누구든지 해결책이 있습니까?PHP 하이라이트 쿼리 및 이스케이프 HTML 특수 문자

+0

'$ query'와'$ text'를'htmlspecialchars()'를 통해 실행하는 것이 잘못된 이유는 무엇입니까? –

+0

@PatrickQ 예를 들어't'를 검색하면'>'은 HTML 코드로 '>'이고't'는 HTML 코드로't'이므로 잘못된 결과를 얻습니다. 그래서'>'의 HTML 코드 안에있는 t도 하이라이트되며 HTML 코드는 일반 텍스트로 표시됩니다. – DreiDe

답변

0

htmlspecialchars()과 정규식 부정적인 선구자 조합을 사용하면이 문제를 해결할 수 있다고 생각합니다.

<php 
$text = "this is just my really basic <test> of words"; 
$query = "<te"; 

$text = htmlspecialchars($text); 
$query = htmlspecialchars($query); 

$highlight = preg_replace('/'.strtolower($query).'(?![^\&]*\;)/', '<span class=highlight>'.strtolower($query).'</span>', strtolower($text)); 

echo $highlight; 
?> 

(작은 노트, 나는 변화의 자유를했다 hightlighthighlight에)

DEMO

귀하의 코멘트에 언급 된 문제를 해결 이것의 부분은 부정적 예측이다 (?![^\&]*\;)

기본적으로 &; 사이에없는 모든 것을 의미합니다.

자,이 분명히 &;가 실제 텍스트의 부분 모두 일부 가장자리 경우에 문제로 실행할 수 있습니다. 어떤 종류의 텍스트 및 쿼리 제한/위생을 수행하지 않는 경우 모두의 경우에 사용할 수있는 것이 있는지 확신 할 수 없습니다.

+0

귀하의 답변을 주셔서 감사합니다 패트릭, 이건 분명히 내 솔루션보다 낫고 내 문제를 해결합니다. 그러나 앞에서 언급했듯이'&'와'; '둘 다 질의에 오류가있을 수 있습니다. 그래서 대답은 여전히 ​​완벽하지 않습니다. 더 좋은 해결책이 있다면 (가능하다면) 여기에 게시하십시오. – DreiDe