我正在尝试使用关键字突出显示来创建搜索表单,但显然我无法突出显示关键字,如果它没有出现在列表中结果的前几个句子中 - 所以我需要创建一个sql语句,它将填充找到的关键字左边的字符数,右边的字符数相同。
任何人都知道这样的SQL语句是什么意思?
好的 - 澄清一下 - 想象下面的SQL语句:
SELECT *
FROM `articles`
WHERE `content` LIKE '%keyword%'
现在 - 此语句将返回与WHERE子句匹配的结果列表。
我接下来要做的是将包含结果集的所有关键字包含在span中,以使用以下方法(PHP)突出显示关键字:
public static function highlight($string = null, $keyword = null, $class = 'highlight') {
return str_ireplace($keyword, "<span class=\"{$class}\">{$keyword}</span>", $string);
}
现在这可以正常工作,但每个结果只显示每个结果的起始X个字符数。
我想要实现的是首先在内容中识别关键字,然后从该关键字的左侧和右侧获取一些内容,以便始终在每个结果中显示关键字。
我希望这是有道理的。
答案 0 :(得分:2)
这可以改进,但在我看来你正在寻找像这样的东西
select *,
case
when locate('search_test',field) < 10 then substring(field,1,char_length('search_test')+10)
else substring(field from locate('search_test',field) - 10 for char_length('search_test') + 20)
end as content
from table
where field like '%search_test%'
答案 1 :(得分:0)
好的 - 我想我已经弄明白了 - 这就是我想出的:
SELECT
IF (
LOCATE('keyword', `content`) < 20,
SUBSTRING(`content`, 1, 200),
SUBSTRING(`content`, LOCATE('keyword', `content`) - 20, 200)
) AS `content`
FROM `table`
WHERE `content` LIKE '%keyword%'
首先确定关键字的位置,然后如果它的索引小于20我只是从头开始获取内容,如果它比第20个索引更进一步,那么我抓住它的索引minux 20个字符,一共到200个字符 - 它有效!
谢谢尼克 - 你的回答非常有用。
只剩下一件事了 - 如何从内容字段中删除html标签以便删除它们 - 也许使用REGEXP - 有谁知道怎么做?