MySQL strip_tags的MySQL查询等价物是什么?

faq*_*faq 20 mysql strip-tags

我有一个大型数据库,其中包含有<a>标签的记录,我想删除它们.当然有一种方法,我创建一个PHP脚本,选择所有,使用strip_tags和更新数据库,但这需要很长时间.那么如何使用简单(或复杂)的MySQL查询来完成这项工作呢?

Boa*_*ann 22

干得好:

CREATE FUNCTION `strip_tags`($str text) RETURNS text
BEGIN
    DECLARE $start, $end INT DEFAULT 1;
    LOOP
        SET $start = LOCATE("<", $str, $start);
        IF (!$start) THEN RETURN $str; END IF;
        SET $end = LOCATE(">", $str, $start);
        IF (!$end) THEN SET $end = $start; END IF;
        SET $str = INSERT($str, $start, $end - $start + 1, "");
    END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)

我确保它删除了不匹配的开括号,因为它们很危险,但它忽略了任何不成对的右括号,因为它们是无害的.

mysql> select strip_tags('<span>hel<b>lo <a href="world">wo<>rld</a> <<x>again<.');
+----------------------------------------------------------------------+
| strip_tags('<span>hel<b>lo <a href="world">wo<>rld</a> <<x>again<.') |
+----------------------------------------------------------------------+
| hello world again.                                                   |
+----------------------------------------------------------------------+
1 row in set
Run Code Online (Sandbox Code Playgroud)

  • `分隔符// CREATE FUNCTION strip_tags($ str text)RETURNS text BEGIN DECLARE $ start,$ end INT DEFAULT 1; LOOP SET $ start = LOCATE("<",$ str,$ start); IF(!$ start)THEN RETURN $ str; 万一; SET $ end = LOCATE(">",$ str,$ start); IF(!$ end)THEN SET $ end = $ start; 万一; SET $ str = INSERT($ str,$ start,$ end - $ start + 1,""); 结束循环; END //分隔符;` (6认同)

Mar*_*ala 9

MySQL> = 5.5提供了XML函数来解决您的问题:

SELECT ExtractValue(field, '//text()') FROM table;
Run Code Online (Sandbox Code Playgroud)

参考:https : //dev.mysql.com/doc/refman/5.5/en/xml-functions.html

  • 当里面有 &lt;br&gt; 时它不起作用 (3认同)
  • 这是不太过时的 MySQL/MariaDB 版本的最佳答案。我想指出 mariadb 也支持这一点。https://mariadb.com/kb/en/library/extractvalue/ (2认同)
  • 我很想使用它,但它不适用于任何包含不终止的 HTML 标记的文本,例如 `&lt;br&gt;` 或 `&lt;img src="" alt=""&gt;`。 (2认同)

dus*_*uff 6

我不相信在MySQL中有任何有效的方法可以做到这一点.

MySQL确实有一个REPLACE()函数,但它只能替换常量字符串,而不能替换模式.您可以编写一个MySQL存储函数来搜索和替换标记,但此时您最好还是编写一个PHP脚本来完成这项工作.它可能不是非常快,但它可能会更快写.


phe*_*cie 5

我传递这个代码,看起来与上面的非常相似.为我工作,希望它有所帮助.

BEGIN
  DECLARE iStart, iEnd, iLength   INT;

  WHILE locate('<', Dirty) > 0 AND locate('>', Dirty, locate('<', Dirty)) > 0
  DO
    BEGIN
      SET iStart = locate('<', Dirty), iEnd = locate('>', Dirty, locate('<', Dirty));
      SET iLength = (iEnd - iStart) + 1;
      IF iLength > 0 THEN
        BEGIN
          SET Dirty = insert(Dirty, iStart, iLength, '');
        END;
      END IF;
    END;
  END WHILE;
  RETURN Dirty;
END
Run Code Online (Sandbox Code Playgroud)

  • 我在5000(~20mb)各种纯文本/ html样本(刮除的工作描述)上做了一个小粗略的基准测试.您的示例输出与Boann完全相同,但是您的代码需要大约32秒才能处理,而Boann只需7秒就可以使**Boann的解决方案快4.5倍**.如果有人会像我一样面临同样的困境,我只是把它放在这里供将来参考.谢谢你们俩. (3认同)