mysql内置函数来剥离标签

时间:2012-07-24 10:45:08

标签: php mysql symfony1

我的代码中有以下sql查询:

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

ANSWER可能包含html&样式标记也使得上述查询在纯文本匹配时不会检索任何内容。我使用 Symfony 1.1 ,上面的查询位于faq.php文件中。

所以有人建议我如何克服这个问题?

4 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

您需要做的是使用PHP函数htmlentities(answer)。 它会将HTML标记显示为纯文本。

希望它有所帮助,

的Bram

答案 2 :(得分:0)

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

在搜索时,例如,剥离标签,删除噪音词和小写SearchQuery,然后在ANSWER_SIMPLE中查找您的SimplifiedSearchQuery。您可能还会做其他技巧,例如在存储之前将所有单词转换为Soundex表单,并搜索(可选地?)“相似性”。

另一种可能性是将SearchQuery分成单个单词并单独搜索它们。因此,如果HTMLised答案不匹配,因为您有“但{em}我{/ em}是您的{em}女王{/ em}!”,那么SearchQuery“您的女王”将无法找到,您可以搜索 “您的”和“女王”的匹配项。这将带来误报,但允许您使用当前数据库而无需使用剥离的辅助列或表。

答案 3 :(得分: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."%')