2011-07-06 73 views
7

我們在MySQL中存儲HTML內容塊(它是在CKeditor中創建的格式化文本,Ckeidor添加了內聯CSS樣式來格式化文本)。我們正在將數據庫存儲在名爲「page_content」的列中。搜索HTML存儲內容時忽略HTML字符PHP/MySQL?

我們需要一個允許用戶搜索文本(僅)的搜索功能。但是,我們不希望搜索返回正在發生的HTML字符。例如,如果我們搜索「字體」,我們不希望搜索結果返回具有HTML樣式的頁面<font>

當從MySQL搜索HTML存儲內容時,是否有某種方法可以忽略HTML/CSS字符?

回答

4

你有沒有考慮針對這些搜索設置單獨的表? MySQL's full text search只適用於MyISAM表,因此您可能不希望將全文搜索與重要數據混合在一起(除非您對外鍵和參照完整性有一些奇怪的厭煩)。

我已經在過去使用的方法基本上是這樣的:

  • 建立一個單獨的表用一個簡單的(ID,搜尋)結構。
    • id匹配您正在搜索的東西的id
    • search_text是你想要搜索的所有東西(正文文本,標題,作者名稱......)。
  • 在搜索表上添加full text indexing
  • 更新您的數據庫更新過程,以便以純文本格式構造相應的search_text字符串;這是你去掉HTML並且可能應用一些其他映射的地方(例如將諸如「A +」之類的東西擴展到全文搜索將找到的東西)。
  • 搜索時,將應用與可搜索數據相同的映射,然後在搜索表中查找匹配項。

這解決了您的HTML問題,讓您可以輕鬆地搜索HTML內容,並允許您通過重複搜索文本的不同組成部分來調整搜索結果(例如,如果您希望標籤更重要而不是正文文本,只需在構建search_text時添加標籤兩次或三次)。

您必須處理您的文本以刪除或忽略HTML。這種方法可以讓您只做一次,而不是在每次搜索時都這樣做。

+0

此解決方案缺乏的唯一方法就是能夠搜索特定字段,因爲它將單個實體的所有文本連接在一起。例如,您不能在標題中找到所有帶有'foo'的實體,因爲在body中具有'foo'的實體也會匹配。 –

+0

@Chris:但是如果需要的話,你可以用額外的列來解決這個問題。 –

+0

@Chris,我們無法刪除HTML。它是使用Ckeditor格式化的內容(傾斜CSS樣式) – user635800