您好我正在为包含一些文章的网站的内部搜索引擎工作。我需要在我的文章中找到以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;">
人类可读的文字总是在&amp; gt 和&amp; lt 之间,所以我需要在该文本中找到关键字。为此,我需要一个类似的查询:
SELECT title, (human readable content) FROM articles WHERE (human readable content) LIKE '%keyword%'
我需要在没有html格式的情况下显示一些人类可读的内容作为描述...就像谷歌描述一样。
我该怎么做?
答案 0 :(得分:2)
执行此类操作并非易事,因为MySQL中没有正则表达式替代。我想你的文本可能有很多html标签,所以你希望将它们全部剥离。如果是这样,并且您计划在SQL中执行此操作 - 那么祝您好运stored procedures。
您可能希望使用LOCATE(),SUBSTR()和REPLACE()执行一些序列替换 - 但取得了不同的成功 - 查看您的示例我发现没有可靠的条件应用它们(这就是我不建议使用示例SQL代码的原因)。
我认为正确的解决方案将在应用程序中执行 - 例如,在PHP中strip_tags()可以轻松解决您的问题问题(但是,您需要从>
和<
还原它们 - 但这很容易)如果它不是PHP,请参阅相应的语言手册。
答案 1 :(得分:1)
SQL非常适合许多任务,但正则表达式替换/匹配不一定是其中之一。您应该考虑将该部分移动到应用程序业务逻辑中,因为它会更容易。
如果您可以将文本的人类可读部分放入单独的列中,这将是最简单的方法。当您将文本写入数据库时,您需要执行正则表达式或DOM解析以去除文本以添加人类可读部分。由于您希望文本位于最内层HTML元素上,而不仅仅是<
和>
之间的文本,因此请查看您是否可以在写入表之前先解析HTML DOM。使用DOM解析器比从头编写解析器更容易。
然后,您可以执行一个简单的SQL查询,以便从人类可读列中进行搜索。您的原始查询将起作用:
SELECT title, content FROM articles WHERE content LIKE '%keyword%'
确保您的人类可读列位于全文索引中,因为如果数据集很大而没有索引,搜索整个表格的速度可能会非常慢。