搜索 HTML 存储内容 PHP/MySQL 时忽略 HTML 字符?

Posted

技术标签:

【中文标题】搜索 HTML 存储内容 PHP/MySQL 时忽略 HTML 字符?【英文标题】:Ignore HTML characters when searching HTML stored content PHP/MySQL? 【发布时间】:2011-09-29 06:03:23 【问题描述】:

我们在 mysql 中存储 html 内容块(它是在 CKeditor 中创建的格式化文本。Ckeidor 添加内联 CSS 样式来格式化文本)。我们将数据库存储在名为“page_content”的列中

我们想要一个允许用户搜索文本的搜索功能(仅)。但是,我们不希望搜索返回 HTML 字符,这就是现在正在发生的事情。例如,如果我们搜索“字体”,我们不希望搜索结果返回具有 HTML 样式的页面<font>

在从 MySQL 搜索 HTML 存储的内容时,有什么方法可以忽略 HTML/CSS 字符?

【问题讨论】:

【参考方案1】:

我猜你想在数据库上进行搜索? (在这种情况下,剥离 HTML 标记意味着您必须将内容存储两次)。

尝试在自然语言模式下使用 MYSQL 全文搜索功能。

http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html

【讨论】:

简单的解决方案总是最好的。谢谢。【参考方案2】:

您是否考虑过为这些搜索设置单独的表格? MySQL's full text search 仅适用于 MyISAM 表,因此您可能不想将全文搜索与重要数据混为一谈(当然,除非您对外键和引用完整性有一些奇怪的厌恶)。

我过去使用的方法基本上是这样的:

使用简单的 (id, search_text) 结构设置单独的表。 id 与您正在搜索的事物的 id 匹配。 search_text 是您想要搜索的所有内容(正文、标题、作者姓名...),它们被混杂成一个文本块。 在搜索表中添加full text indexing。 更新您的数据库更新过程以将适当的search_text 字符串构造为纯文本;在这里您可以去除 HTML 并可能应用一些其他映射(例如将“A+”之类的内容扩展到全文搜索将找到的内容)。 搜索时,应用与应用到可搜索数据相同的映射,然后在搜索表中查找匹配项。

这解决了您的 HTML 问题,让您可以轻松搜索 HTML 内容以外的内容,并允许您通过重复对搜索文本的不同组件进行加权来调整搜索结果(例如,如果您希望标签比正文更重要)文本,只需在构建search_text时添加标签两三次即可。

您必须处理您的文本以删除或忽略 HTML。这种方法让您只需执行一次,而不是每次搜索都执行一次。

【讨论】:

该解决方案唯一缺少的是能够搜索特定字段,这是将单个实体的所有文本连接在一起的结果。例如,您无法找到标题中包含“foo”的所有实体,因为正文中包含“foo”的实体也会匹配。 @Chris:但如果需要,您可以通过额外的列来解决这个问题。 @Chris,我们无法删除 HTML。它是使用 Ckeditor 格式化的内容(倾斜 CSS 样式) @user635800:但是您可以存储来自 CKEditor 的 text/html 的单独文本/纯文本版本。

以上是关于搜索 HTML 存储内容 PHP/MySQL 时忽略 HTML 字符?的主要内容,如果未能解决你的问题,请参考以下文章

从数据库(PHP MySQL)中搜索和显示结果不适合 html 中的表格

如何使用 jquery 从 iframe 获取内容? [复制]

完美解决php+mysql汉字存储乱码问题

使用选项编码 PHP/MYSQL 搜索的最佳方法 [关闭]

在 PHP MySQL 搜索中未找到结果时显示消息

PHP mysql使用关键字搜索多个表