今天整理了一下博客文章格式,需要把下面字样的内容删掉:

<p>
 <br />
</p>

但是调用 MySQL 函数的时候发现 replace 函数不支持正则表达式,这我就犯难了。上网搜索到一个自定义正则表达式函数,结果返回的都是乱码,分析了一下源码发现根本不支持我想要的操作。迫于无奈,看了一些文档之后自己修改出了一个函数:

DELIMITER $$
CREATE FUNCTION `regex_delete`(pattern VARCHAR(1000), len INT, original TEXT CHARACTER SET utf8)

RETURNS TEXT CHARACTER SET utf8
DETERMINISTIC
BEGIN 
 DECLARE temp TEXT CHARACTER SET utf8;
 DECLARE str TEXT CHARACTER SET utf8;
 DECLARE i INT;
 DECLARE pre INT;
 SET pre = 1;
 SET i = 1;
 SET temp = '';
 IF original REGEXP pattern THEN 
  loop_label: LOOP 
   IF i>CHAR_LENGTH(original) THEN
    SET temp = CONCAT(temp,SUBSTRING(original,pre,i-pre));
    LEAVE loop_label;  
   END IF;
   SET str = SUBSTRING(original,i,len);
   IF str REGEXP pattern THEN
    SET temp = CONCAT(temp,SUBSTRING(original,pre,i-pre));
    SET i=i+len;
    SET pre=i;
   ELSE
    SET i=i+1; 
   END IF;
  END LOOP;
 ELSE
  SET temp = original;
 END IF;
 RETURN temp;
END$$
DELIMITER ;

调用方法如下,需要传入三个参数,第一个参数为正则表达式,第二个参数为你要删除的内容的长度,第三个参数为被执行的内容,支持中文不会有乱码。可惜我水平有限,写出来的函数也只能支持我这种情况,没有普适性。

UPDATE `typecho_contents` SET `text` = regex_delete('<p>...<br./>..</p>', 18, text)
转载保留版权:http://haipz.com/blog/i/6506 - 海胖博客