我有一个大型数据库,其中包含有<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)
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
我不相信在MySQL中有任何有效的方法可以做到这一点.
MySQL确实有一个REPLACE()
函数,但它只能替换常量字符串,而不能替换模式.您可以编写一个MySQL存储函数来搜索和替换标记,但此时您最好还是编写一个PHP脚本来完成这项工作.它可能不是非常快,但它可能会更快写.
我传递这个代码,看起来与上面的非常相似.为我工作,希望它有所帮助.
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)
归档时间: |
|
查看次数: |
33232 次 |
最近记录: |