Mysql 用通配符替换字符串

Mysql 用通配符替换字符串,mysql,database,wordpress,replace,Mysql,Database,Wordpress,Replace,我正在将一个我管理的站点从一个定制的CMS移动到Wordpress,我发现图像标签上的一些属性在WP环境中显示时会出现问题。为了解决这个问题,我需要去掉wp\u posts表的post\u content列中内联到每个图像标记中的height属性 从数据库中的原始值开始,我需要以下内容: <img src="http://example.com/img/20150823_image.jpg" style="width: 730px; height: 730px;" /> <i

我正在将一个我管理的站点从一个定制的CMS移动到Wordpress,我发现图像标签上的一些属性在WP环境中显示时会出现问题。为了解决这个问题,我需要去掉
wp\u posts
表的
post\u content
列中内联到每个图像标记中的height属性

从数据库中的原始值开始,我需要以下内容:

<img src="http://example.com/img/20150823_image.jpg" style="width: 730px; height: 730px;" />
<img src="http://example.com/img/20150823_image.jpg" style="width: 730px;" />

如果有任何帮助,我将不胜感激,因为我不必手动将数千行内容剥离出来。

您可以使用函数进行文本解析:

create function f_strip_height( in_s text ) returns text
begin

declare v_start int;
declare v_end int;
declare v_height text;

select locate(' height:', in_s ) into v_start;
if (v_start>0) then

  select locate( 'px;', substring( in_s, v_start)  ) into v_end;

  select trim(substring(substring( in_s, v_start, v_end+2), 9)) into v_height;

  if (v_end>0 and concat(cast(v_height as unsigned), 'px;' =  v_height)) then
    return concat(substring( in_s, 1, v_start-1), substring( in_s, v_start+v_end+2));
  end if;
end if;

return in_s;
end
然后使用以下功能:

UPDATE wp_posts SET post_content = f_strip_height(post_content);

这不是SQL的作业。下面是一个简单的(?)PHP脚本,应该可以实现这一点,尽管我是在头脑中完成的,所以不能保证:


如果您拥有适当的权限,您可以使用自定义项,有些可以是:

在另一种情况下,如前所述,您可以执行自己的功能,这里是一个可以根据需要修改和调整的版本:

mysql>删除表(如果存在)`wp_posts`;
查询正常,0行受影响(0.00秒)
mysql>创建表(如果不存在)`wp_posts`(
->`post_content`文本
-> );
查询正常,0行受影响(0.00秒)
mysql>插入到'wp_posts'中`
->(`post_content`)
->价值观
->     (''),
->     (''),
->     (''),
->     (''),
->     ('');
查询正常,5行受影响(0.01秒)
记录:5个重复:0警告:0
mysql>分隔符//
mysql>删除函数(如果存在)`get\u字符串`//
查询正常,0行受影响(0.00秒)
mysql>创建函数“获取字符串”(“字符串”文本,
->`u begin`VARCHAR(255),
->`u end`VARCHAR(255))
->返回文本
->开始
->声明“\u begin\u pos”INT无符号默认位置(`u begin`、`u string`);
->声明“\u end\u pos”INT未签名默认值为0;
->如果“\u begin\u pos”不为空且“\u begin\u pos”>0,则
->设置“\u-end\u-pos”:=定位(`u-end`、`u-string`、`u-begin\u-pos`);
->如果“\u end\u pos”不为空且“\u end\u pos”>0,则
->返回子字符串(`u string`,
->“开始位置”,
->(`U end\\U pos`+字符长度(`U end`)-`U begin\\U pos`);
->如果结束;
->如果结束;
->返回“”;
->结束//
查询正常,0行受影响(0.00秒)
mysql>分隔符;
mysql>选择“发布内容”`
->来自“wp_posts”;
+-----------------------------------------------------------------------------------------------+
|发布内容|
+-----------------------------------------------------------------------------------------------+
|   |
|  |
|    |
|     |
|                  |
+-----------------------------------------------------------------------------------------------+
一组5行(0.00秒)
mysql>更新'wp_帖子`
->设置'post_content`=REPLACE('post_content`、'get_string`、'post_content`、'height:'、';')、'';
查询正常,4行受影响(0.01秒)
匹配的行:5个已更改:4个警告:0
mysql>选择“发布内容”`
->来自“wp_posts”;
+-------------------------------------------------------------------------------+
|发布内容|
+-------------------------------------------------------------------------------+
|  |
|  |
|  |
|  |
|  |
+-------------------------------------------------------------------------------+
一组5行(0.00秒)

例如。

您需要使用正则表达式进行替换。不幸的是,SQL并没有在replace函数中提供这种功能。最好是编写一个php脚本,逐行执行替换。这将起作用,只要格式完全相同(
style
是元素的最后一个属性,
height
是该属性中的最后一个规则,总是使用双引号,元素是自动关闭的,等等),就可以轻松地将函数改进为更通用的。修改了示例代码。这不是我的重点,因为我可以继续玩这个游戏:
height:0,如果这是最后一条规则并且没有分号,那么其他设置了高度的元素呢?我想说的是,仅使用子字符串索引解析标记将非常脆弱,甚至比!(作为记录,我很清楚这是吹毛求疵;我仍然对这项工作投了赞成票!)这个用例非常直截了当,目的不是创建一个完整的CSS解析器。您可以看到数据中存在的CSS高度组合,并为此准备函数。运行更新后,SSeybold可以将数据传输到Wordpress。如果数据的格式可以复制/粘贴,这可能会更有帮助。@miken32:添加了示例。
UPDATE wp_posts SET post_content = f_strip_height(post_content);