2

我的网站上有一个搜索功能,可以浏览论坛上的帖子。使用 MySQL SELECT 语句执行搜索。

SELECT * 
FROM my_table
WHERE post_text LIKE '%$search_string%';

匹配后,我会返回找到的帖子并突出显示原始帖子中的术语。

function highlight_finds($search_text, $search_for){
   $replacement_string = "<mark>".$search_for."</mark>";
   $replaced_text = str_ireplace($search_for, $replacement_string, $search_text);
   return $replaced_text;
}

echo highlight_finds(stripslashes($post_text), $search_string);

换行符用数据库表中的“br”来解释。

 line 1 <br /> <br /> line 2 <br /> <br /> line 3

当我使用搜索词“br”在上面运行我的 highlight_finds 函数时,将返回以下 HTML

line 1 <<mark>br</mark> /><<mark>br</mark> />line 2 
<<mark>br</mark> /><<mark>br</mark> />line 3

标记标签放置在 br 标签周围,任何带有换行符的帖子都会在结果中返回并与 br 标签一起显示。

在搜索术语“br”、“b”或“r”时,防止返回换行符的最佳方法是什么?

4

1 回答 1

0

您必须strip_tags在搜索时尝试使用 mysql 自定义功能

CREATE FUNCTION strip_tags( x longtext) RETURNS longtext
LANGUAGE SQL NOT DETERMINISTIC READS SQL DATA
BEGIN
DECLARE sstart INT UNSIGNED;
DECLARE ends INT UNSIGNED;
SET sstart = LOCATE('<', x, 1);
REPEAT
SET ends = LOCATE('>', x, sstart);
SET x = CONCAT(SUBSTRING( x, 1 ,sstart -1) ,SUBSTRING(x, ends +1 )) ;
SET sstart = LOCATE('<', x, 1);
UNTIL sstart < 1 END REPEAT;
return x;
END;

SELECT * 
FROM my_table
WHERE strip_tags(post_text) LIKE '%$search_string%';

编辑

或者在 php 中你可以使用strip_tags()

function highlight_finds($search_text, $search_for){
   $replacement_string = "<mark>".$search_for."</mark>";
   $replaced_text = str_ireplace($search_for, $replacement_string, strip_tags($search_text));
   return $replaced_text;
}

参考

使用 mysql 删除 HTML 标签

php 带标签

于 2013-09-15T19:27:18.780 回答