2017-10-13 8 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>と解釈されます。これは理にかなっていますが、私はこれを望んでいません。私は結果として<test><teと強調したい。だから私は特殊文字をエスケープする必要があります。私は、関数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

関連する問題