【问题标题】:mysql inbuilt function to strip off tagsmysql内置函数剥离标签
【发布时间】:2012-07-24 10:45:08
【问题描述】:

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

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

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

那么任何人都可以建议我如何克服这个问题?

【问题讨论】:

  • 没有这个功能,抱歉。保留answer 的纯文本副本怎么样?
  • 考虑过更新吗? Symfony 1.1 不支持 3 年了(至少最新的安全 更新“只有”2 岁:D)!不要说你应该使用 symfony2,但至少 1.3 或 1.4 应该让你睡得更好:D
  • @KingCrunch sf1.1 仍然使用旧的表单系统,迁移到 sf1.3/4 可能是一场噩梦。但我同意你的看法。
  • @j0k 我知道你的意思,但是迁移表单可能是一场噩梦,但受损的系统是一场噩梦;)在我看来,有时没有办法绕过更新。我个人更喜欢持续更新,这样可以减少噩梦(但也许它们来得更频繁^^)
  • 嗨 Piskvor,保留答案的痛苦文本副本在以后编辑时将无法正常工作,因为它会丢失用户给出的所有样式标签并让他们有点恼火,不是吗?是吗?

标签: php mysql symfony1


【解决方案1】:

我原本是说:

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

但现在这是由于 cmets 添加的内容..

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

$query = mysql_query("SELECT `answer` FROM `faq` WHERE (`answer` LIKE '%$searchKey%'");
while ($result = mysql_fetch_object($query)) {
    $newStrippedItem = strip_tags($result->columnItemName);
}

【讨论】:

  • 嗨,我明白了你的想法,但 $searchKey 是纯文本。我想做 strip_tags(answer)..!
  • 您应该在将数据返回到应用程序后执行此操作。因此,一旦您将记录集放入 $result,请将所有逻辑应用于您需要的每个项目。我将修改我的答案以表明我的意思。
【解决方案2】:

现成的没有这样的功能。虽然它可以被编写,但准备一个“简化”版本的 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” 将找不到,您可以搜索both“your”和“Queen”的匹配项。这将导致误报,但允许您使用当前数据库,而无需借助剥离的辅助列或表。

【讨论】:

    【解决方案3】:

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

    希望对你有帮助,

    布拉姆

    【讨论】:

      【解决方案4】:

      好吧,我知道这是旧的,但我认为您可以通过在 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 标记以及 &lt;style&gt;&lt;/style&gt; 标记之间的所有内容。

      然后你可以这样查询:

      SELECT plain_text(ANSWER) as plain_t FROM FAQ HAVING (plain_t LIKE '%".$searchKey."%')
      

      【讨论】:

        猜你喜欢
        • 2014-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-21
        • 2021-05-05
        • 2013-07-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多