1

I have the following sql query in my code:

SELECT ANSWER FROM FAQ WHERE (ANSWER LIKE '%".$searchKey."%')

Where ANSWER might contains html & style tags also which makes the above query to retrieve nothing though the plain text matches. I am using Symfony 1.1 and the above query resides in faq.php file.

So can anybody suggest how can i overcome this problem?

4

4 回答 4

0

没有现成的这样的功能。虽然可以编写它,但准备一个“简化”版本的 ANSWER 并在该版本上运行全文匹配会更加高效。毕竟,搜索将在带标签的 ANSWER 版本上进行:无论是由 mysql_strip_tag 函数生成还是存储在 ANSWER_SIMPLE 列中,逻辑都是相同的。

例如,在搜索时,您可以去除标签、删除干扰词和小写 SearchQuery,然后在 ANSWER_SIMPLE 中查找您的 SimplifiedSearchQuery。您还可以执行其他技巧,例如在存储之前将所有单词转换为它们的 Soundex 形式,并搜索(可选?)“相似性”。

另一种可能性是将 SearchQuery 分块为单个单词并分别搜索它们。因此,如果 HTML 化的答案不匹配,因为您说“但是 {em}I{/em} am your {em}Queen{/em}!”,而 SearchQuery “your Queen” 将找不到,您可以搜索“your”“Queen”的匹配项。这将导致误报,但允许您使用当前数据库而无需借助剥离的辅助列或表。

于 2012-07-24T13:32:12.237 回答
0

好吧,我知道这很旧,但是我认为您可以通过在以下位置创建此功能来解决您的问题mysql

DELIMITER |
DROP FUNCTION IF EXISTS plain_text |
CREATE FUNCTION plain_text( Dirty text )
RETURNS text
DETERMINISTIC 
BEGIN
  DECLARE iStart, iEnd, iLength int;
    WHILE Locate( '<', Dirty ) > 0 And Locate( '>', Dirty, Locate( '<', Dirty )) > 0 DO
      BEGIN
        SET iStart = Locate( '<style>', Dirty ), iEnd = Locate( '</style>', Dirty);
        IF iEnd > 0 THEN
            BEGIN
                SET iLength = ( iEnd - iStart) + 12;
            END;
        ELSE
            BEGIN
                SET iStart = Locate( '<', Dirty ), iEnd = Locate( '>', Dirty, Locate('<', Dirty ));
                SET iLength = ( iEnd - iStart) + 1;
            END;
        END IF;
        IF iLength > 0 THEN
          BEGIN
            SET Dirty = Insert( Dirty, iStart, iLength, '');
          END;
        END IF;
      END;
    END WHILE;
    RETURN Dirty;
END;
|
DELIMITER ;

此函数删除所有 html 标签以及<style></style>标签之间的所有内容。

然后你可以像这样进行查询:

SELECT plain_text(ANSWER) as plain_t FROM FAQ HAVING (plain_t LIKE '%".$searchKey."%')
于 2013-04-18T11:28:30.190 回答
0

您需要做的是使用该PHP功能htmlentities(answer)。它将HTML标签显示为纯文本。

希望能帮助到你,

布拉姆

于 2012-07-24T13:22:47.923 回答
0

我原来说:

"SELECT `answer` FROM `faq` WHERE (`answer` LIKE '%".strip_tags($searchKey)."%'")

但现在这是由于评论而添加的内容..

那为什么不做这样的事情呢?

$query = mysql_query("SELECT `answer` FROM `faq` WHERE (`answer` LIKE '%$searchKey%'");
while ($result = mysql_fetch_object($query)) {
    $newStrippedItem = strip_tags($result->columnItemName);
}
于 2012-07-24T10:51:50.790 回答