2017-10-13 182 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

剛纔通過'htmlspecialchars()'運行'$ query'和'$ text'有什麼問題? –

+0

@PatrickQ如果我舉個例子來搜索't',我得到了一個錯誤的結果,因爲'>'是HTML代碼,這個'>'和't'代碼只是't'的HTML代碼。所以'''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