我的代码中有以下sql查询:
SELECT ANSWER FROM FAQ WHERE (ANSWER LIKE '%".$searchKey."%')
ANSWER可能包含html&样式标记也使得上述查询在纯文本匹配时不会检索任何内容。我使用 Symfony 1.1 ,上面的查询位于faq.php
文件中。
所以有人建议我如何克服这个问题?
答案 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."%')