3

您好,我正在为我的网站开发包含一些文章的内部搜索引擎。我需要在我的文章中找到以 HTML 编码格式保存在我的数据库中的关键字。

例如,这可能是我数据库上的一篇文章

</h2><p><span style="color:#FF0000;">Lorem ipsum dolor sit 
amet</span>, consectetur adipiscing elit. Cras nec elit quis urna laoreet venenatis. 
<em>Vestibulum</em> a erat orci. In hac habitasse platea dictumst. Nunc pulvinar,
felis vel facilisis commodo, lectus sem accumsan ante, non vestibulum ligula lorem nec leo. 
In nec elit at dolor aliquam consequat sed sed leo. Nulla facilisi. Fusce id turpis magna. 
<span style="background-color:#FFFF00;">

人类可读的文本总是在><之间,所以我需要在该文本中找到关键字。为此,我需要这样的查询:

SELECT title, (human readable content) FROM articles WHERE (human readable content) LIKE '%keyword%'

而且我需要显示一些没有 html 格式的人类可读的内容作为描述......就像谷歌描述一样。

我该怎么做?

4

2 回答 2

2

执行这样的操作并不是一件容易的事,因为在 MySQL 中没有用正则表达式代替。我想您的文本可能有许多 html 标签,因此您希望将它们全部剥离。如果是这样并且您打算在 SQL 中执行此操作,那么祝您使用存储过程好运。

您可能希望使用LOCATE()SUBSTR()REPLACE()执行一些串行替换- 但取得了各种成功 - 查看您的示例,我发现应用它们没有可靠的条件(这就是为什么我不建议使用示例SQL 代码)。

我认为正确的解决方案是在应用程序中执行此操作- 例如,在 PHP 中有strip_tags()可以轻松解决您的问题(但是,您需要从中恢复它们&gt;-&lt;但这是一项简单的任务)如果不是PHP,参考相应的语言手册。

于 2013-10-25T12:44:25.827 回答
1

SQL 非常适合许多任务,但正则表达式替换/匹配不一定是其中之一。您应该考虑将该部分移动到您的应用程序业务逻辑中,因为这样会容易得多。

如果您可以将文本的人类可读部分放入单独的列中,这将是最简单的方法。当您将文本写入数据库时​​,您需要进行正则表达式或 DOM 解析以去除文本以添加人类可读的部分。由于您想要最里面的 HTML 元素上的文本,而不仅仅是任何&lt;and之间的内容,因此请先&gt;查看是否可以在写入表之前先解析 HTML DOM。使用 DOM 解析器可能比从头开始编写解析器更容易。

然后,您可以执行一个简单的 SQL 查询来从人类可读的列中进行搜索。您的原始查询将起作用:

SELECT title, content FROM articles WHERE content LIKE '%keyword%'

确保您的人类可读列位于全文索引中,因为如果数据集很大而没有索引,则搜索整个表可能会很慢。

于 2013-10-25T13:10:01.567 回答